線程池的工作流程主要包括任務提交、線程分配、任務執行和線程回收等環節,以下是對其詳細的描述:
-
任務提交
- 當有任務需要執行時,用戶通過線程池提供的提交方法,如
execute()
或submit()
方法,將任務(通常是實現了Runnable
接口或Callable
接口的對象)提交給線程池。
- 當有任務需要執行時,用戶通過線程池提供的提交方法,如
-
線程分配
- 判斷核心線程是否已滿:線程池首先會檢查當前正在運行的線程數量是否小于核心線程數
corePoolSize
。如果是,線程池會創建一個新的線程來執行提交的任務。 - 任務入隊:如果當前線程數量已經達到核心線程數,那么線程池會嘗試將任務放入任務隊列
workQueue
中。如果任務隊列是有界隊列且尚未滿,任務會被成功放入隊列中等待執行。 - 判斷最大線程數:如果任務隊列已滿,線程池會檢查當前線程數量是否小于最大線程數
maximumPoolSize
。如果是,線程池會創建新的線程來執行任務,即使核心線程都在忙碌狀態。
- 判斷核心線程是否已滿:線程池首先會檢查當前正在運行的線程數量是否小于核心線程數
-
任務執行
- 當有空閑線程時,它會從任務隊列中獲取任務。線程池中的線程在執行任務時,會調用任務的
run()
方法(如果是Runnable
任務)或call()
方法(如果是Callable
任務)來執行具體的業務邏輯。 - 如果任務執行過程中出現異常,默認情況下線程池會將異常拋出。不過,可以通過自定義的方式來處理這些異常,比如記錄日志等。
- 當有空閑線程時,它會從任務隊列中獲取任務。線程池中的線程在執行任務時,會調用任務的
-
線程回收
- 判斷是否為多余線程:當任務執行完成后,線程不會立即銷毀,而是會進入空閑狀態并等待新的任務。如果當前線程池中的線程數量超過了核心線程數,并且這些多余的線程在一定時間(
keepAliveTime
)內沒有接收到新的任務,那么這些線程會被銷毀,以釋放資源。 - 保持核心線程:核心線程默認情況下會一直存在于線程池中,即使它們處于空閑狀態,除非設置了
allowCoreThreadTimeOut(true)
,這樣核心線程在空閑時間超過keepAliveTime
后也會被回收。
- 判斷是否為多余線程:當任務執行完成后,線程不會立即銷毀,而是會進入空閑狀態并等待新的任務。如果當前線程池中的線程數量超過了核心線程數,并且這些多余的線程在一定時間(
-
拒絕策略處理
- 如果線程池中的線程數量已經達到最大線程數
maximumPoolSize
,并且任務隊列也已滿,此時再提交新的任務,線程池會根據設置的拒絕策略handler
來處理這些任務。如采用AbortPolicy
策略會直接拋出異常,CallerRunsPolicy
策略會讓提交任務的線程來執行任務等。
- 如果線程池中的線程數量已經達到最大線程數