深刻淺出 Java Concurrency (30): 線程池 part 3 Executor 生命週期[轉]

咱們知道線程是有多種執行狀態的,一樣管理線程的線程池也有多種狀態。JVM會在全部線程(非後臺daemon線程)所有終止後才退出,爲了節省資源和有效釋放資源關閉一個線程池就顯得很重要。有時候沒法正確的關閉線程池,將會阻止JVM的結束。java

線程池Executor是異步的執行任務,所以任什麼時候刻不可以直接獲取提交的任務的狀態。這些任務有可能已經完成,也有可能正在執行或者還在排隊等待執行。所以關閉線程池可能出現一下幾種狀況:異步

  • 平緩關閉:已經啓動的任務所有執行完畢,同時再也不接受新的任務
  • 當即關閉:取消全部正在執行和未執行的任務

另外關閉線程池後對於任務的狀態應該有相應的反饋信息。.net

圖1 描述了線程池的4種狀態。線程

  • 線程池在構造前(new操做)是初始狀態,一旦構造完成線程池就進入了執行狀態RUNNING。嚴格意義上講線程池構造完成後並無線程被當即啓動,只有進行「預啓動」或者接收到任務的時候纔會啓動線程。這個會後面線程池的原理會詳細分析。可是線程池是出於運行狀態,隨時準備接受任務來執行。
  • 線程池運行中能夠經過shutdown()和shutdownNow()來改變運行狀態。shutdown()是一個平緩的關閉過程,線程池中止接受新的任務,同時等待已經提交的任務執行完畢,包括那些進入隊列尚未開始的任務,這時候線程池處於SHUTDOWN狀態;shutdownNow()是一個當即關閉過程,線程池中止接受新的任務,同時線程池取消全部執行的任務和已經進入隊列可是尚未執行的任務,這時候線程池處於STOP狀態。
  • 一旦shutdown()或者shutdownNow()執行完畢,線程池就進入TERMINATED狀態,此時線程池就結束了。
  • isTerminating()描述的是SHUTDOWN和STOP兩種狀態。
  • isShutdown()描述的是非RUNNING狀態,也就是SHUTDOWN/STOP/TERMINATED三種狀態。

 

Executor-Lifecycle

圖1blog

線程池的API以下:隊列

ExecutorService-LifeCycle

圖2資源

其中shutdownNow()會返回那些已經進入了隊列可是尚未執行的任務列表。awaitTermination描述的是等待線程池關閉的時間,若是等待時間線程池尚未關閉將會拋出一個超時異常。get

對於關閉線程池期間發生的任務提交狀況就會觸發一個拒絕執行的操做。這是java.util.concurrent.RejectedExecutionHandler描述的任務操做。下一個小結中將描述這些任務被拒絕後的操做。it

 

總結下這個小節:io

  1. 線程池有運行、關閉、中止、結束四種狀態,結束後就會釋放全部資源
  2. 平緩關閉線程池使用shutdown()
  3. 當即關閉線程池使用shutdownNow(),同時獲得未執行的任務列表
  4. 檢測線程池是否正處於關閉中,使用isShutdown()
  5. 檢測線程池是否已經關閉使用isTerminated()
  6. 定時或者永久等待線程池關閉結束使用awaitTermination()操做
相關文章
相關標籤/搜索