若是當前線程池中的線程數目小於corePoolSize,則每來一個任務,就會建立一個線程去執行這個任務;若是當前線程池中的線程數目>=corePoolSize,則每來一個任務,會嘗試將其添加到任務緩存隊列當中,若添加成功,則該任務會等待空閒線程將其取出去執行;若添加失敗(通常來講是任務緩存隊列已滿),則會嘗試建立新的線程去執行這個任務;若是隊列已經滿了,則在總線程數不大於maximumPoolSize的前提下,則建立新的線程 若是當前線程池中的線程數目達到maximumPoolSize,則會採起任務拒絕策略進行處理;若是線程池中的線程數量大於 corePoolSize時,若是某線程空閒時間超過keepAliveTime,線程將被終止,直至線程池中的線程數目不大於corePoolSize;若是容許爲核心池中的線程設置存活時間,那麼核心池中的線程空閒時間超過keepAliveTime,線程也會被終止。緩存
這是上篇文章講到的 線程池原理 https://blog.csdn.net/qq_41977838/article/details/105918233app
下面咱們利用原理自定義一個線程池ide
public class Test0007 {
this
public static void main(String[] args) {
spa
ThreadPoolExecutor executor = new ThreadPoolExecutor(1, 2, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
.net
for (int i = 1; i <= 6; i++) {
線程
TaskThred t1 = new TaskThred("任務" + i);
code
executor.execute(t1);
orm
}
blog
executor.shutdown();
}
}
class TaskThred implements Runnable {
private String taskName;
public TaskThred(String taskName) {
this.taskName = taskName;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+taskName);
}
}
經過線程池原理咱們就能夠實現一個簡單的自定義線程池
咱們直接實現 new ThreadPoolExecutor(1, 2, 60L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(3)); (詳解:ThreadPoolExecutor 底層實現線程池方法,1:核心線程數,2:最大線程數,60L :線程沒有任務執行時最多保持多久時間會終止,TimeUnit.SECONDS:底層實現,表示一秒爲單位,new ArrayBlockingQueue<>(3) :ArrayBlockingQueue是一個阻塞式的隊列,傳入隊列個數 )
調用 executor.execute(t1);
結束 executor.shutdown();