Java Concurrent包 - 線程池ThreadPoolExecutor
core and maximux pool sizes
- 核心線程數(corePoolSize)
- 最大線程數(maximumPoolSize)
- 任務隊列(workerQueue)
當一個新任務提交後:線程
- 若正在運行的線程數 < corePoolSize,即便其餘工做線程處於空閒狀態,也會建立一個新線程來處理這個任務
- 若 corePoolSize < 正在運行線程數 < maximumPoolSize,則只有在workerQueue已滿的狀況下才會建立新線程
保持活動時間(Keep-alive times)
若是當前池中線程的數量超過corePoolSize,在這些額外線程中,閒置時間超過keepAliveTime的將會被終止。生命週期
默認狀況下,保活策略只有在線程數超過corePoolSize的時候被啓用。隊列
當allowCoreThreadTimeOut=true時,容許在空閒超時的狀況下關閉核心線程ci
隊列
任何BlockingQueue能夠用來傳輸和保持提交的任務,這個queue的使用與池的大小有關:it
- 若運行的線程數 < corePoolSize,Executor會添加新的線程而不是讓任務進入隊列
- 若運行的線程數 >= corePoolSize,Executor會讓新的任務進入隊列而不是建立新的線程
- 若沒法將新的任務加入隊列(隊滿),則建立新的線程,直到池中線程數超過maximumPoolSize,若線程數達到maximumPoolSize,新的任務將會被拒絕
有三大排隊策略:io
- 直接提交:默認爲SynchronousQueue
- 無界隊列:好比LinkedBlockingQueue
- 有界隊列:好比ArrayBlockingQueue
任務拒絕
當Executor已經被關閉,或者Executor使用的有界隊列容量已經飽和而且已達到最大線程數時,新提交的任務將會被拒絕。在任何一種狀況下,execute方法將會調用RejectedExecutionHandler的rejectedExecution方法。thread
線程池的結束(Finalization)
當線程池再也不被程序使用而且沒有其餘的線程在執行時,將會被自動關閉。線程池
runState
runState提供了主要的生命週期控制,取值範圍:transition
- RUNNING: Accept new tasks and process queued tasks
- SHUTDOWN: Don't accept new tasks, but process queued tasks
- STOP: Don't accept new tasks, don't process queued tasks, and interrupt in-progress tasks
- TIDYING: All tasks have terminated, workerCount is zero, the thread transitioning to state TIDYING will run the terminated() hook method
- TERMINATED: terminated() has completed
runState的狀態轉變:程序
- RUNNING -> SHUTDOWN: On invocation of shutdown(), perhaps implicitly in finalize()
- (RUNNING or SHUTDOWN) -> STOP: On invocation of shutdownNow()
- SHUTDOWN -> TIDYING: When both queue and pool are empty
- STOP -> TIDYING: When pool is empty
- TIDYING -> TERMINATED: When the terminated() hook method has completed