在Java中,線程是程序執行的最小單元,線程的狀態反映了線程在其生命周期中的不同階段。了解線程的狀態對于編寫高效、穩定的多線程程序至關重要。本文將詳細介紹Java中的線程狀態,包括每種狀態的定義、轉換條件以及相關的代碼示例。
Java中的線程狀態由java.lang.Thread.State
枚舉類定義,共有六種狀態:
這些狀態描述了線程在其生命周期中的不同階段。下面我們將逐一介紹每種狀態。
當一個線程對象被創建但尚未啟動時,它處于NEW
狀態。此時,線程還沒有開始執行,也沒有分配任何系統資源。
Thread thread = new Thread(() -> {
System.out.println("Thread is running");
});
System.out.println("Thread state: " + thread.getState()); // 輸出: Thread state: NEW
start()
方法后,線程從NEW
狀態轉換為RUNNABLE
狀態。當線程調用start()
方法后,線程進入RUNNABLE
狀態。此時,線程已經準備好運行,但可能還沒有真正開始執行,具體取決于操作系統的調度。
Thread thread = new Thread(() -> {
System.out.println("Thread is running");
});
thread.start();
System.out.println("Thread state: " + thread.getState()); // 輸出: Thread state: RUNNABLE
BLOCKED
狀態。Object.wait()
、Thread.join()
或LockSupport.park()
方法,線程將進入WTING
狀態。Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
或LockSupport.parkNanos(long nanos)
等方法,線程將進入TIMED_WTING
狀態。TERMINATED
狀態。當線程嘗試獲取一個對象的鎖,但該鎖已被其他線程持有時,線程將進入BLOCKED
狀態。此時,線程無法繼續執行,直到鎖被釋放。
Object lock = new Object();
Thread thread1 = new Thread(() -> {
synchronized (lock) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread thread2 = new Thread(() -> {
synchronized (lock) {
System.out.println("Thread2 acquired the lock");
}
});
thread1.start();
thread2.start();
Thread.sleep(500); // 確保thread1先獲取鎖
System.out.println("Thread2 state: " + thread2.getState()); // 輸出: Thread2 state: BLOCKED
RUNNABLE
狀態,等待CPU調度。當線程調用了Object.wait()
、Thread.join()
或LockSupport.park()
方法時,線程將進入WTING
狀態。此時,線程將無限期地等待,直到其他線程喚醒它。
Object lock = new Object();
Thread thread = new Thread(() -> {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
thread.start();
Thread.sleep(500); // 確保線程進入WTING狀態
System.out.println("Thread state: " + thread.getState()); // 輸出: Thread state: WTING
Object.notify()
或Object.notifyAll()
方法時,線程將被喚醒,重新進入RUNNABLE
狀態。當線程調用了Thread.sleep(long millis)
、Object.wait(long timeout)
、Thread.join(long millis)
或LockSupport.parkNanos(long nanos)
等方法時,線程將進入TIMED_WTING
狀態。此時,線程將等待指定的時間,或者被其他線程喚醒。
Thread thread = new Thread(() -> {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread.start();
Thread.sleep(500); // 確保線程進入TIMED_WTING狀態
System.out.println("Thread state: " + thread.getState()); // 輸出: Thread state: TIMED_WTING
RUNNABLE
狀態。當線程執行完畢或因為異常而終止時,線程將進入TERMINATED
狀態。此時,線程的生命周期結束,無法再次啟動。
Thread thread = new Thread(() -> {
System.out.println("Thread is running");
});
thread.start();
thread.join(); // 等待線程執行完畢
System.out.println("Thread state: " + thread.getState()); // 輸出: Thread state: TERMINATED
TERMINATED
狀態,就無法再轉換到其他狀態。為了更直觀地理解線程狀態的轉換,下面是一個線程狀態轉換圖:
NEW -> RUNNABLE -> BLOCKED
| |
v v
WTING <-> TIMED_WTING
|
v
TERMINATED
Java中的線程狀態是理解多線程編程的基礎。通過了解每種狀態的定義、轉換條件以及相關的代碼示例,我們可以更好地掌握線程的生命周期,從而編寫出高效、穩定的多線程程序。在實際開發中,合理管理線程狀態,避免死鎖、資源競爭等問題,是確保程序正確運行的關鍵。
通過本文的詳細介紹,相信讀者對Java中的線程狀態有了更深入的理解。在實際開發中,合理管理線程狀態,避免死鎖、資源競爭等問題,是確保程序正確運行的關鍵。希望本文能幫助讀者在多線程編程中更加得心應手。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。