1. 程式人生 > >【Java多執行緒】執行緒狀態、執行緒池狀態

【Java多執行緒】執行緒狀態、執行緒池狀態

執行緒狀態:

 

 

執行緒共包括以下5種狀態。
1. 新建狀態(New)
  
執行緒物件被建立後,就進入了新建狀態。例如,Thread thread = new Thread()。

2. 就緒狀態(Runnable)
  
也被稱為“可執行狀態”。執行緒物件被建立後,其它執行緒呼叫了該物件的start()方法,從而來啟動該執行緒。
  例如,thread.start()。處於就緒狀態的執行緒,隨時可能被CPU排程執行。

3. 執行狀態(Running)
  
執行緒獲取CPU許可權進行執行。需要注意的是,執行緒只能從就緒狀態進入到執行狀態。

4. 阻塞狀態(Blocked)
  
阻塞狀態是執行緒因為某種原因放棄CPU使用權,暫時停止執行。直到執行緒進入就緒狀態,才有機會轉到執行狀態。阻塞的情況分三種:

    (01) 等待阻塞 -- 通過呼叫執行緒的wait()方法,讓執行緒等待某工作的完成。
    (02) 同步阻塞 -- 執行緒在獲取synchronized同步鎖失敗(因為鎖被其它執行緒所佔用),它會進入同步阻塞狀態。
    (03) 其他阻塞 -- 通過呼叫執行緒的sleep()或join()或發出了I/O請求時,執行緒會進入到阻塞狀態。
      當sleep()狀態超時、join()等待執行緒終止或者超時、或者I/O處理完畢時,執行緒重新轉入就緒狀態。

5. 死亡狀態(Dead)
  
執行緒執行完了或者因異常退出了run()方法,該執行緒結束生命週期。




 

執行緒池狀態:

1. RUNNING

(01) 狀態說明:執行緒池處在RUNNING狀態時,能夠接收新任務,以及對已新增的任務進行處理。
(02) 狀態切換:執行緒池的初始化狀態是RUNNING。換句話說,執行緒池被一旦被建立,就處於RUNNING狀態!
道理很簡單,在ctl的初始化程式碼中(如下),就將它初始化為RUNNING狀態,並且"任務數量"初始化為0。

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

 

2. SHUTDOWN

(01) 狀態說明:執行緒池處在SHUTDOWN狀態時,不接收新任務,但能處理已新增的任務。
(02) 狀態切換:呼叫執行緒池的shutdown()介面時,執行緒池由RUNNING -> SHUTDOWN。

 

3. STOP

(01) 狀態說明:執行緒池處在STOP狀態時,不接收新任務,不處理已新增的任務,並且會中斷正在處理的任務。
(02) 狀態切換:呼叫執行緒池的shutdownNow()介面時,執行緒池由(RUNNING or SHUTDOWN ) -> STOP。

 

4. TIDYING
(01) 狀態說明:當所有的任務已終止,ctl記錄的"任務數量"為0,執行緒池會變為TIDYING狀態。當執行緒池變為TIDYING狀態時,會執行鉤子函式terminated()。terminated()在ThreadPoolExecutor類中是空的,若使用者想線上程池變為TIDYING時,進行相應的處理;可以通過過載terminated()函式來實現。
(02) 狀態切換:當執行緒池在SHUTDOWN狀態下,阻塞佇列為空並且執行緒池中執行的任務也為空時,就會由 SHUTDOWN -> TIDYING。
當執行緒池在STOP狀態下,執行緒池中執行的任務為空時,就會由STOP -> TIDYING。

 

5. TERMINATED
(01) 狀態說明:執行緒池徹底終止,就變成TERMINATED狀態。
(02) 狀態切換:執行緒池處在TIDYING狀態時,執行完terminated()之後,就會由 TIDYING -> TERMINATED。