在 Java 中,線程有幾種狀態,主要包括 NEW
(新建)、RUNNABLE
(可運行)、BLOCKED
(阻塞)、WAITING
(等待)、TIMED_WAITING
(計時等待)、和 TERMINATED
(終止)。
以下是這些狀態之間的轉換:
-
NEW(新建): 當使用
new Thread()
創建一個線程對象時,線程處于新建狀態。 -
RUNNABLE(可運行): 調用
start()
方法后,線程進入可運行狀態。此時,線程調度器可以隨時選擇這個線程來運行。 -
BLOCKED(阻塞): 線程在獲取鎖時,如果鎖被其他線程占用,就會進入阻塞狀態。當其他線程釋放鎖時,阻塞的線程重新進入可運行狀態。
-
WAITING(等待): 當線程調用
Object.wait()
、Thread.join()
或LockSupport.park()
方法時,線程進入等待狀態。在等待狀態下,線程需要等待其他線程的通知或中斷。 -
TIMED_WAITING(計時等待): 當線程調用帶有超時參數的
Thread.sleep()
、Object.wait(long)
、Thread.join(long)
、LockSupport.parkNanos()
或LockSupport.parkUntil()
方法時,線程進入計時等待狀態。在計時等待狀態下,線程等待一段時間后會自動返回可運行狀態。 -
TERMINATED(終止): 線程執行完
run
方法或者發生了未捕獲的異常導致線程提前終止時,線程進入終止狀態。
這些狀態之間的轉換是由線程調度器和線程本身的操作共同決定的。例如,線程執行完 run
方法后,就會進入終止狀態。阻塞狀態、等待狀態和計時等待狀態都是由線程本身執行的一些方法引起的。不同的狀態之間的切換可以通過線程的執行、等待、阻塞等操作觸發。