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):已終止線程的線程狀态,線程已經結束執行。
上述六種狀态在遇到特定事件發生的時候将會互相轉換,轉換關系如下
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGL3EzXlpXazxSWHpVNQFnY1wUa2UTRxVTN2lHc1EUcvVTbyEWNiFXW1EXcZVjeP9WNxlGT1EUaMVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZwpmLyUjNxADNykDM5ATOwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)