Java線程狀態(tài)
在 Java 中,線程有多種狀態(tài),并且 Java 提供了 Thread.State
枚舉類來表示這些狀態(tài)。下面為你詳細介紹線程的狀態(tài)以及這個枚舉類。
線程的狀態(tài)
Java 中線程的狀態(tài)由 Thread.State
枚舉類定義,總共有 6 種狀態(tài):
- NEW(新建):線程對象已經創(chuàng)建,但還沒有調用
start()
方法。 - RUNNABLE(可運行):線程已經調用了
start()
方法,正在 Java 虛擬機中執(zhí)行,但可能正在等待操作系統(tǒng)的其他資源(如 CPU)。此狀態(tài)包含了傳統(tǒng)意義上的“就緒”和“運行”兩種狀態(tài)。 - BLOCKED(阻塞):線程在等待獲取一個排他鎖,這個鎖被其他線程持有,導致該線程暫時無法繼續(xù)執(zhí)行。
- WAITING(等待):線程正在等待另一個線程執(zhí)行特定的操作。例如,調用了
Object.wait()
、Thread.join()
或LockSupport.park()
方法。處于這種狀態(tài)的線程不會被分配 CPU 時間片,需要其他線程喚醒。 - TIMED_WAITING(計時等待):和
WAITING
狀態(tài)類似,不過它有一個指定的等待時間。例如,調用了Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
或LockSupport.parkNanos()
、LockSupport.parkUntil()
方法。 - TERMINATED(終止):線程的執(zhí)行已經結束,可能是正常結束,也可能是因為拋出了未捕獲的異常而終止。
Thread.State
枚舉類代碼示例
下面是一個簡單的 Java 代碼示例,展示了如何使用 Thread.State
枚舉類來獲取線程的狀態(tài):
public class ThreadStateExample { public static void main(String[] args) { // 創(chuàng)建一個新線程 Thread thread = new Thread(() -> { try { // 線程休眠 2 秒 Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } }); // 獲取線程初始狀態(tài)(NEW) Thread.State state = thread.getState(); System.out.println("線程初始狀態(tài): " + state); // 啟動線程 thread.start(); // 獲取線程啟動后的狀態(tài)(RUNNABLE 或 TIMED_WAITING) state = thread.getState(); System.out.println("線程啟動后的狀態(tài): " + state); try { // 等待線程執(zhí)行完畢 thread.join(); } catch (InterruptedException e) { e.printStackTrace(); } // 獲取線程終止后的狀態(tài)(TERMINATED) state = thread.getState(); System.out.println("線程終止后的狀態(tài): " + state); } }
代碼解釋
- 在代碼中,首先創(chuàng)建了一個新線程
thread
,此時線程處于NEW
狀態(tài)。 - 調用
start()
方法啟動線程后,線程進入RUNNABLE
狀態(tài),由于線程中調用了Thread.sleep(2000)
方法,所以它會進入TIMED_WAITING
狀態(tài)。 - 最后,使用
join()
方法等待線程執(zhí)行完畢,線程執(zhí)行結束后進入TERMINATED
狀態(tài)。
通過這個示例,你可以清晰地看到線程在不同階段的狀態(tài)變化,以及如何使用 Thread.State
枚舉類來獲取線程的狀態(tài)。
JUC編程 文章被收錄于專欄
JUC 是 Java.util.concurrent 包的簡稱,它是 Java 5 引入的一個用于處理并發(fā)編程的工具包,為 Java 開發(fā)者提供了一系列用于高效處理并發(fā)任務的類和接口,極大地簡化了多線程編程的復雜性。