執行緒池執行順序
阿新 • • 發佈:2021-09-08
執行緒池引數
- 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(); } } }
總結流程
核心執行緒數 → 新增到佇列 →新增到最大執行緒數 → 達到最大執行緒數根據拒絕策略處理(拋異常或者忽略)