ThreadPoolExecutor

ExecutorService 通過服務線程中的一個來執(zhí)行任務,ExecutorService通過Executors的工場方法進行配置

ThreadPoolExecutor解決兩種不同的問題,當解決大量的異步任務的時候可以提升性能,因為減少了每一個任務的文件調(diào)取,提供了管理資源和線程的方法。線程池也會保存一些常量,比如執(zhí)行任務的數(shù)量

為了能更有效的適應更廣泛的使用場景,ThreadPoolExecutor提供了可調(diào)節(jié)性的參數(shù),以及可拓展的hooks。不論怎么,程序員會更愿意去用更方便的Executors的工場方法,

如果提交任務的數(shù)量小于核心線程數(shù)量,會創(chuàng)建一個新的工作線程去處理任務,即使別的工作線程正在空轉(zhuǎn)。如果當前運行的線程數(shù)量大于核心線程數(shù)量小于最大的線程數(shù)量,只有當隊列已滿的時候會創(chuàng)建新線程。當設定核心線程數(shù)和設定最大線程數(shù)相同時候,當前線程池就是一個 fixed-size 線程池。核心線程數(shù)和最大線程數(shù)可以通過方法動態(tài)設定。

默認的情況下,工作線程是當新任務到達的時候初始化和創(chuàng)建,但是這個規(guī)則可以通過動態(tài)重寫方法prestartCoreThread 和方法 prestartAllCoreThread,當你創(chuàng)建一個非空的任務隊列的時候,可能會希望提前啟動線程。

如果沒有特別的設定,新的線程會通過ThreadFactory創(chuàng)建,而通過ThreadFactory創(chuàng)建的線程會同屬于一個線程組,都是一個優(yōu)先級,以及都不是一個都不是守護線程,如果ThreadFactory通過newThread方法創(chuàng)建線程失敗會返回null。

如果線程池當前的線程數(shù)量超過核心線程數(shù)量,如果超過核心線程數(shù)量的線程被閑置的時間超過keepAliveTime,超過數(shù)量的線程會被終止,以減少資源的消耗,keepAliveTime可以通過方法setkeepAliveTime()改變,核心線程也可以設置超時策略,但是必須得通過方法allowCoreThreadTimeout(boolean )設置,且keepAliveTime不能為0

一個BlockingQueue會被創(chuàng)建用來存儲等待執(zhí)行的任務,隊列大小收線程的核心線程數(shù)影響

如果正在運行的線程數(shù)小于corePoolSize,線程池更愿意將任務入隊列,而不是創(chuàng)建新線程,當新來一個任務時候如果正在運行的線程數(shù)大于maximumPoolSize,新的任務會被拒絕執(zhí)行

總體有三種排隊策略

  1. SynchronizedQueue;
  2. LinkedBlockingQueue;
  3. ArrayBlockingQueue;
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容