在 Java 里,線程有 6 種執行狀態,這些狀態都在?java.lang.Thread.State
?枚舉類中被定義。下面為你詳細介紹這些狀態:
1. NEW(新建狀態)
當你創建了一個?Thread
?對象,卻還未調用其?start()
?方法時,線程就處于新建狀態。此時,線程僅僅是一個對象實例,操作系統還未為其分配資源和執行環境。
示例代碼:
java
Thread thread = new Thread(() -> {System.out.println("線程正在執行");
});
// 此時 thread 處于 NEW 狀態
2. RUNNABLE(可運行狀態)
調用?start()
?方法之后,線程就進入了可運行狀態。這一狀態又包含兩種情況:
- 就緒狀態:線程已經獲取了除 CPU 之外的所有必要資源,正在等待操作系統的調度以獲取 CPU 時間片。
- 運行狀態:線程已經獲得 CPU 時間片,正在執行其?
run()
?方法中的代碼。
示例代碼:
java
Thread thread = new Thread(() -> {System.out.println("線程正在執行");
});
thread.start();
// 調用 start() 后,線程進入 RUNNABLE 狀態
3. BLOCKED(阻塞狀態)
當線程試圖獲取一個被其他線程占用的鎖時,會進入阻塞狀態。在獲取到鎖之前,線程會一直等待。
示例代碼:
java
class LockExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}});Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("線程 2 獲得鎖");}});thread1.start();thread2.start();// 線程 2 可能會進入 BLOCKED 狀態,等待線程 1 釋放鎖}
}
4. WAITING(等待狀態)
線程調用以下方法后會進入等待狀態:
Object.wait()
Thread.join()
LockSupport.park()
處于等待狀態的線程會一直等待,直到其他線程調用對應的喚醒方法,如?Object.notify()
?或?Object.notifyAll()
。
示例代碼:
java
class WaitingExample {private static final Object lock = new Object();public static void main(String[] args) {Thread thread1 = new Thread(() -> {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}System.out.println("線程 1 被喚醒");}});Thread thread2 = new Thread(() -> {synchronized (lock) {lock.notify();System.out.println("線程 2 喚醒線程 1");}});thread1.start();try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}thread2.start();}
}
5. TIMED_WAITING(定時等待狀態)
線程調用以下帶有超時參數的方法后會進入定時等待狀態:
Thread.sleep(long millis)
Object.wait(long timeout)
Thread.join(long millis)
LockSupport.parkNanos(long nanos)
LockSupport.parkUntil(long deadline)
在指定的時間過去之后,線程會自動恢復到可運行狀態。
示例代碼:
java
Thread thread = new Thread(() -> {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("線程等待結束");
});
thread.start();
// 線程進入 TIMED_WAITING 狀態,等待 1 秒
6. TERMINATED(終止狀態)
線程的?run()
?方法執行完畢,或者因異常而提前結束時,線程就進入終止狀態。一旦線程進入終止狀態,就無法再重新啟動。
示例代碼:
java
Thread thread = new Thread(() -> {System.out.println("線程正在執行");
});
thread.start();
// 線程執行完畢后進入 TERMINATED 狀態
綜上所述,Java 線程的 6 種執行狀態反映了線程在其生命周期中的不同階段,了解這些狀態有助于你更好地控制和管理線程。