1. 程式人生 > 其它 >執行緒池執行順序

執行緒池執行順序

執行緒池引數

  • corePoolSize 核心執行緒數,
  • 最大執行緒數 maximumPoolSize,
  • 執行緒沒有執行任務保持多久會終止 keepAliveTime,
  • 時間單位 TimeUnit unit,
  • 阻塞佇列 BlockingQueue workQueue

所有的任務排程都是由execute方法完成。

執行緒池執行順序

  • 首先檢測執行緒池執行狀態,如果不是running,則直接拒絕。
  • 如果workCount < corePoolSize,則建立並啟動一個執行緒執行緒來執行提交任務。
  • 如果workCount >= corePoolSize,且執行緒池阻塞佇列未滿,則將任務新增到阻塞佇列中。
  • 如果workCount >= corePoolSize && workCount < maximumPoolSize,並且執行緒池內的阻塞佇列已滿,則建立並啟動一個執行緒來執行新提交的任務。
  • 如果workCount >= maximumPoolSize ,並且阻塞佇列已滿,則根據拒絕策略來處理改任務,預設是直接丟擲異常
package thread;

import org.junit.Test;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: jeremy
 * @Date: 
 * @desc:
 */
public class ThreadPoolTest {

	int corePoolSize = 3;
	int maximumPoolSize = 5;

	@Test
	public void test() {
		BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(5);
		ThreadPoolExecutor executor =new ThreadPoolExecutor(corePoolSize,maximumPoolSize,1L, TimeUnit.MILLISECONDS,workQueue);
		//執行任務,未達到核心執行緒數之前,建立執行緒
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//核心執行緒滿了,阻塞佇列未滿,任務新增到佇列中
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//阻塞佇列滿了,任務未達到最大執行緒數
		executor.execute(new TestTask());
		executor.execute(new TestTask());
		//任務大於最大執行緒數,執行拒絕策略
		executor.execute(new TestTask());
	}
}

class TestTask implements Runnable{

	@Override
	public void run() {
		try {
			TimeUnit.DAYS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

總結流程

核心執行緒數 → 新增到佇列 →新增到最大執行緒數 → 達到最大執行緒數根據拒絕策略處理(拋異常或者忽略)

測試程式碼