線程池參數(shù)含義
/**
* ThreadPoolExecutor: 最全的構造方法又7個參數(shù):
* int corePoolSize: 表示的是核心線程數(shù)量,
* int maximumPoolSize: 線程池線程最大數(shù)量
* keepAliveTime,unit 非核心線程在空閑多久后回收
* BlockingQueue<Runnable> workQueue 緩存任務的阻塞隊列
* ThreadFactory threadFactory 指定創(chuàng)建線程的工廠
* RejectedExecutionHandler handler 緩存隊列已滿,且線程池數(shù)量達到最大(maximumPoolSize),線程池拒絕添加新任務的策略
*
*/
public synchronized ExecutorService executorService() {
if (executorService == null) {
executorService = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>(), Util.threadFactory("OkHttp Dispatcher", false));
}
return executorService;
}
記錄下線程池的策略:
1)如果沒有空閑的線程執(zhí)行該任務且當前運行的線程數(shù)少于corePoolSize,則添加新的線程執(zhí)行該任務
2)如果沒有空閑的線程執(zhí)行該任務且當前的線程數(shù)等于corePoolSize同時阻塞隊列未滿,則將任務入隊列,而不添加新的線程。
3)如果沒有空閑的線程執(zhí)行該任務且阻塞隊列已滿同時池中的線程數(shù)小于maximumPoolSize,則創(chuàng)建新的線程執(zhí)行任務。
4)如果沒有空閑的線程執(zhí)行該任務且阻塞隊列已滿同時池中的線程數(shù)等于maximumPoolSize,則根據(jù)構造函數(shù)中的handler指定的策略來拒絕新的任務。
合理配置線程池
要想合理地配置線程池,就必須首先分析任務特性
要想合理地配置線程池,就必須首先分析任務特性,可以從以下幾個角度來分析。
?任務的性質(zhì):CPU密集型任務、IO密集型任務和混合型任務。
?任務的優(yōu)先級:高、中和低。
?任務的執(zhí)行時間:長、中和短。
?任務的依賴性:是否依賴其他系統(tǒng)資源,如數(shù)據(jù)庫連接。
性質(zhì)不同的任務可以用不同規(guī)模的線程池分開處理。CPU密集型任務應配置盡可能小的線程,如配置Ncpu+1個線程的線程池。由于IO密集型任務線程并不是一直在執(zhí)行任務,則應配置盡可能多的線程,如2*Ncpu?;旌闲偷娜蝿?,如果可以拆分,將其拆分成一個CPU密集型任務和一個IO密集型任務,只要這兩個任務執(zhí)行的時間相差不是太大,那么分解后執(zhí)行的吞吐量將高于串行執(zhí)行的吞吐量。如果這兩個任務執(zhí)行時間相差太大,則沒必要進行分解??梢酝ㄟ^Runtime.getRuntime().availableProcessors()方法獲得當前設備的CPU個數(shù)。