引言
線程是 Java 編程中重要的概念之一。通過多線程,程序可以同時執行多個任務,提高效率和響應能力。理解和管理線程的生命周期是編寫高效并發程序的關鍵。本文將詳細介紹 Java 線程的生命周期管理,并解釋幾種關鍵方法:start()
、sleep(long millis)
、join()
、yield()
和 interrupt()
。
線程的生命周期
Java 線程的生命周期可以分為五個主要階段:
- 新建(New):線程對象被創建,但尚未調用
start()
方法。 - 就緒(Runnable):線程對象調用了
start()
方法,等待 CPU 調度執行。 - 運行(Running):線程獲得 CPU 資源,開始執行
run()
方法。 - 阻塞(Blocked):線程因為某種原因(如等待資源)暫時停止執行。
- 死亡(Dead):線程執行完
run()
方法或被終止,進入死亡狀態。
線程的生命周期管理方法
start()
: 啟動線程
start()
方法用于啟動線程,它將線程從新建狀態轉移到就緒狀態,并等待 CPU 調度執行。調用 start()
方法后,JVM 會調用線程的 run()
方法。
public class StartExample extends Thread {@Overridepublic void run() {System.out.println("Thread is running");}public static void main(String[] args) {StartExample thread = new StartExample();thread.start(); // 啟動線程}
}
sleep(long millis)
: 使線程休眠指定的時間
Thread.sleep(long millis)
方法使當前線程暫停執行一段時間(以毫秒為單位),進入阻塞狀態。這對模擬延時或控制線程執行的節奏非常有用。
public class SleepExample extends Thread {@Overridepublic void run() {try {System.out.println("Thread is going to sleep");Thread.sleep(2000); // 休眠2秒System.out.println("Thread is awake");} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {SleepExample thread = new SleepExample();thread.start();}
}
join()
: 等待線程終止
join()
方法使當前線程等待調用 join()
的線程執行完畢再繼續執行。這在需要確保某個線程完成其任務后再執行其他任務時非常有用。
public class JoinExample extends Thread {@Overridepublic void run() {System.out.println("Thread is running");}public static void main(String[] args) {JoinExample thread = new JoinExample();thread.start();try {thread.join(); // 等待 thread 執行完畢System.out.println("Thread has finished");} catch (InterruptedException e) {e.printStackTrace();}}
}
yield()
: 暫停當前正在執行的線程對象,并執行其他線程
Thread.yield()
方法使當前正在執行的線程讓出 CPU 資源,但不會進入阻塞狀態,仍然處于就緒狀態。這有助于提高 CPU 使用效率,讓其他同優先級的線程有機會執行。
public class YieldExample extends Thread {@Overridepublic void run() {for (int i = 0; i < 5; i++) {System.out.println(Thread.currentThread().getName() + " - " + i);Thread.yield(); // 讓出 CPU 資源}}public static void main(String[] args) {YieldExample thread1 = new YieldExample();YieldExample thread2 = new YieldExample();thread1.start();thread2.start();}
}
interrupt()
: 中斷線程
interrupt()
方法用于中斷線程。當一個線程被中斷時,如果它處于阻塞狀態(例如在調用 sleep()
方法時),會拋出 InterruptedException
異常;如果它沒有處于阻塞狀態,則會設置線程的中斷標志。
public class InterruptExample extends Thread {@Overridepublic void run() {try {while (!Thread.currentThread().isInterrupted()) {System.out.println("Thread is running");Thread.sleep(1000);}} catch (InterruptedException e) {System.out.println("Thread was interrupted");}}public static void main(String[] args) {InterruptExample thread = new InterruptExample();thread.start();try {Thread.sleep(3000); // 主線程休眠3秒thread.interrupt(); // 中斷子線程} catch (InterruptedException e) {e.printStackTrace();}}
}
結論
Java 提供了多種方法來管理線程的生命周期,包括 start()
、sleep(long millis)
、join()
、yield()
和 interrupt()
。通過理解和正確使用這些方法,可以有效地控制線程的執行,提高程序的并發性能。