線程池的參數及執行順序

線程池的優勢

  1. 下降系統資源消耗,經過複用已存在的線程,下降線程建立和銷燬形成的開銷;
  2. 提升系統響應速度,當有任務到達時,經過複用已存在的線程,無需等待新線程建立便當即可以執行。
  3. 方便線程併發數的管控,由於線程是稀缺資源,如果無限制的建立,可能會致使內存佔用過多而產生OOM,而且會形成CPU過分切換。使用線程池可以進行統一分配、調優和監控。
  4. 提供更強大的功能,延時定時線程池。

線程池的主要參數

public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
    this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
         Executors.defaultThreadFactory(), defaultHandler);
}

1 corePoolSize:核心線程數

核心線程會一直存活,及時沒有任務須要執行
當線程數小於核心線程數時,即便有線程空閒,線程池也會優先建立新線程處理
設置allowCoreThreadTimeout=true(默認false)時,核心線程會超時關閉

java

2 queueCapacity:任務隊列容量(阻塞隊列)

當核心線程數達到最大時,新任務會放在隊列中排隊等待執行併發

3 maxPoolSize:最大線程數

當線程數>=corePoolSize,且任務隊列已滿時。線程池會建立新線程來處理任務
當線程數=maxPoolSize,且任務隊列已滿時,線程池會拒絕處理任務而拋出異常
this

4 keepAliveTime:線程空閒時間

當線程空閒時間達到keepAliveTime時,線程會退出,直到線程數量=corePoolSize
若是allowCoreThreadTimeout=true,則會直到線程數量=0
spa

5 allowCoreThreadTimeout:容許核心線程超時

6 threadFactory 線程工廠

建立一個新線程時使用的工廠,能夠用來設定線程名、是否爲daemon線程等等線程

7 rejectedExecutionHandler:任務拒絕處理器

兩種狀況會拒絕處理任務:
當線程數已經達到maxPoolSize,切隊列已滿,會拒絕新任務
當線程池被調用shutdown()後,會等待線程池裏的任務執行完畢,再shutdown。若是在調用shutdown()和線程池真正shutdown之間提交任務,會拒絕新任務
線程池會調用rejectedExecutionHandler來處理這個任務。若是沒有設置默認是AbortPolicy,會拋出異常


code

ThreadPoolExecutor類有幾個內部實現類來處理這類狀況:
AbortPolicy 丟棄任務,拋運行時異常
CallerRunsPolicy 執行任務
DiscardPolicy 忽視,什麼都不會發生
DiscardOldestPolicy 從隊列中踢出最早進入隊列(最後一個執行)的任務
實現RejectedExecutionHandler接口,可自定義處理器




blog

線程池流程

在這裏插入圖片描述

相關文章
相關標籤/搜索