ThreadPoolExecutor 是一個服務(ExecutorService),用於執行被提交過來的任務(task)的。通常上,會把任務放到從線程池中的線程去執行。
而 ThreadPoolExecutor 可以有不同的線程池可以使用。通過不同的創建方法:Executors.new****ThreadPool ()
- newCachedThreadPool 沒有邊界,每次都新增一個線程
- newFixedThreadPool 固定線程大小
- newSingleThreadExecutor 單線程的線程池
核心 / 最大線程池大小#
當一個新的任務提交過來後(execute (runnable)),會根據 MaximumPoolSize 和 CorePoolSize 兩個參數的設置來決定任務的去向。
如果當前的正在運行的線程數大於 CorePoolSize 而且小於 MaximunPoolSize 且當前的等待隊列滿了,就會創建一個線程。
也就是說,如果把這兩個參數設置成一樣的話,就相當於創建了一個 FixedThreadPool。而如果把 MaximumPoolSize 設置的很大的話,就相當於創建了一個 CachedThreadPool。
存活時間#
線程的存活時間,線程在沒有工作的時候,會在經過這麼後被釋放。如果被設置成很大數的話,很久才能回收資源。不能為零。
拒絕策略#
如果 core pool size 和 maximum pool size 和隊列都滿了,需要對剛加入的新任務進行處理。有幾種處理方式。
- 直接在 execute () 的這個線程執行任務
- 拋出異常 RejectedExecutionException
- 丟棄這個任務。
- 將最久(隊列頭處的那個)的一個線程丟棄。
這是提供的方式,也可以自己實現 RejectedExecutionHandler 接口。
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
}
}
狀態變換#
整個生命周期裡,在 Running、Stop、Shutdown、Tiddying、Terminated 之間轉換。
內部類#
worker#
用來執行 task 的。Service 的 private boolean addWorker (Runnable firstTask, boolean core) 根據狀態創建 worker, 並執行。