線程池參數
- 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();
}
}
}
總結流程
核心線程數 → 添加到隊列 →添加到最大線程數 → 達到最大線程數根據拒絕策略處理(拋異常或者忽略)