J.U.C包 - 線程池ThreadPoolExecutor

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
相關文章
相關標籤/搜索