天天看點

Java的六種線程狀态

Java語言定義了6種線程狀态,在任意一個時間點,一個線程隻能有且隻有其中的一種狀态,這6種狀态分别如下。

  • 建立(New):建立後尚未啟動的線程處于這種狀态。
  • 運作(Runable):Runable包括了作業系統線程狀态中的Running和Ready,也就是處于此狀态的線程有可能正在執行,也有可能正在等待着CPU為它配置設定執行時間。
  • 無限期等待(Waiting):處于這種狀态的線程不會被配置設定CPU執行時間,它們要等待被其他線程顯式地喚醒。以下方法會讓線程陷入無限期的等待狀态:
    • ● 沒有設定Timeout參數的Object.wait()方法。
    • ● 沒有設定Timeout參數的Thread.join()方法。
    • ● LockSupport.park()方法。
  • 限期等待(Timed Waiting):處于這種狀态的線程也不會被配置設定CPU執行時間,不過無須等待被其他線程顯式地喚醒,在一定時間之後它們會由系統自動喚醒。以下方法會讓線程進入限期等待狀态:
    • ● Thread.sleep()方法。
    • ● 設定了Timeout參數的Object.wait()方法。
    • ● 設定了Timeout參數的Thread.join()方法。
    • ● LockSupport.parkNanos()方法。
    • ● LockSupport.parkUntil()方法。
  • 阻塞(Blocked):線程被阻塞了,“阻塞狀态”與“等待狀态”的差別是:“阻塞狀态”在等待着擷取到一個排他鎖,這個事件将在另外一個線程放棄這個鎖的時候發生;而“等待狀态”則是在等待一段時間,或者喚醒動作的發生。在程式等待進入同步區域的時候,線程将進入這種狀态。
  • 結束(Terminated):已終止線程的線程狀态,線程已經結束執行。

上述六種狀态在遇到特定事件發生的時候将會互相轉換,轉換關系如下

Java的六種線程狀态