天天看點

Java并發程式設計一線程池的五種狀态

推薦:​​Java并發程式設計彙總​​

Java并發程式設計一線程池的五種狀态

原文位址

​​Java多線程線程池(4)–線程池的五種狀态​​

正文

線程池的5種狀态:​

​Running​

​​、​

​ShutDown​

​​、​

​Stop​

​​、​

​Tidying​

​​、​

​Terminated​

​。

線程池各個狀态切換架構圖:

Java并發程式設計一線程池的五種狀态

RUNNING

  1. 狀态說明:線程池處在​

    ​RUNNING​

    ​狀态時,能夠接收新任務(線程池沒有滿的情況下),以及對已添加的任務進行處理。
  2. 狀态切換:線程池的初始化狀态是​

    ​RUNNING​

    ​​。換句話說,線程池一旦被建立,就處于​

    ​RUNNING​

    ​​狀态,并且線程池中的任務數為​

    ​0​

    ​。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));      

SHUTDOWN

  1. 狀态說明:線程池處在​

    ​SHUTDOWN​

    ​狀态時,不接收新任務,但能處理已添加的任務。
  2. 狀态切換:調用線程池的​

    ​shutdown()​

    ​​接口時,線程池由​

    ​RUNNING​

    ​​ -> ​

    ​SHUTDOWN​

    ​。

STOP

  1. 狀态說明:線程池處在​

    ​STOP​

    ​狀态時,不接收新任務,不處理已添加的任務,并且會中斷正在處理的任務。
  2. 狀态切換:調用線程池的​

    ​shutdownNow()​

    ​​接口時,線程池由(​

    ​RUNNING​

    ​​ or ​

    ​SHUTDOWN​

    ​​ ) -> ​

    ​STOP​

    ​。
  1. 狀态說明:當所有的任務已終止,​

    ​ctl​

    ​​記錄的​

    ​任務數量​

    ​​為​

    ​0​

    ​​,線程池會變為​

    ​TIDYING​

    ​​狀态。當線程池變為​

    ​TIDYING​

    ​​狀态時,會執行鈎子函數​

    ​terminated()​

    ​​。​

    ​terminated()​

    ​​在​

    ​ThreadPoolExecutor​

    ​​類中是空的,若使用者想線上程池變為​

    ​TIDYING​

    ​​時,進行相應的處理;可以通過重載​

    ​terminated()​

    ​函數來實作。
  2. 狀态切換:當線程池在​

    ​SHUTDOWN​

    ​​狀态下,阻塞隊列(任務隊列)為空并且線程池中執行的任務也為空時,就會由 ​

    ​SHUTDOWN​

    ​​ ->​

    ​TIDYING​

    ​​。 當線程池在​

    ​STOP​

    ​​狀态下,線程池中執行的任務為空時,就會由​

    ​STOP​

    ​​ -> ​

    ​TIDYING​

    ​。
  1. 狀态說明:線程池徹底終止,就變成​

    ​TERMINATED​

    ​狀态。
  2. 狀态切換:線程池處在​

    ​TIDYING​

    ​​狀态時,執行完​

    ​terminated()​

    ​​之後,就會由 ​

    ​TIDYING​

    ​​ -> ​

    ​TERMINATED​

    ​。

繼續閱讀