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í)行
總體有三種排隊策略
- SynchronizedQueue;
- LinkedBlockingQueue;
- ArrayBlockingQueue;