Java 線程控制遠不止 start()、run()、sleep()。掌握 isAlive()、currentThread()、interrupt()、stop()、join() 等核心方法,才能精準掌控線程生命週期與協作關係。
線程從 start() 啟動到正常終止或異常結束前,皆處於「存活」狀態,返回 true;新建或已死亡則返回 false。常用於監控線程池或協調邏輯中。
屬於 Thread 類方法,返回正在佔用 CPU 的線程引用。典型用法:if (Thread.currentThread() == targetThread) ... 以區分不同線程執行邏輯。
當線程因 sleep()、wait()、join() 等進入阻塞,調用 interrupt() 會拋出 InterruptedException,使線程提前醒來並進入就緒隊列。注意:不會強制終止線程,需自行捕獲異常處理後續邏輯。
直接殺死線程,釋放所有鎖,極易導致數據不一致、死鎖等嚴重問題,生產環境嚴禁使用,僅供理解歷史 API。
調用線程(如主線程)調用 targetThread.join() 後阻塞,直到目標線程執行完畢。常用於「主線程等待子任務完成」場景。
class Classroom implements Runnable {
Thread student, teacher;
Classroom() {
teacher = new Thread(this, "王教授");
student = new Thread(this, "張三");
}
public void run() {
if (Thread.currentThread() == student) {
try {
System.out.println(student.getName() + " 正在睡覺,不聽課");
Thread.sleep(1000 * 60 * 60); // 睡 1 小時
} catch (InterruptedException e) {
System.out.println(student.getName() + " 被老師叫醒了");
}
} else if (Thread.currentThread() == teacher) {
for (int i = 1; i <= 3; i++) System.out.println("上課!");
try { Thread.sleep(500); } catch (InterruptedException e) {}
student.interrupt(); // 喚醒學生
}
}
}
public class InterruptDemo {
public static void main(String[] args) {
Classroom c = new Classroom();
c.student.start();
c.teacher.start();
}
}
class TV { float price; String name; TV(String n, float p) { name=n; price=p; } }
class Factory implements Runnable {
TV tv; Thread customer, maker;
Factory() { customer=new Thread(this,"顧客"); maker=new Thread(this,"製造商"); }
public void run() {
if (Thread.currentThread() == customer) {
System.out.println(customer.getName()+" 等 "+maker.getName()+" 生產電視");
try { maker.join(); } catch (InterruptedException e) {}
System.out.println(customer.getName()+" 買到 "+tv.name+" 價格:"+tv.price);
} else {
System.out.println(maker.getName()+" 開始生產...");
try { Thread.sleep(2000); } catch (InterruptedException e) {}
tv = new TV("長虹牌", 4500);
System.out.println(maker.getName()+" 生產完畢!");
}
}
}
public class JoinDemo {
public static void main(String[] args) {
Factory f = new Factory();
f.customer.start(); f.maker.start();
}
}
interrupt() + 異常處理實現優雅停止,避免 stop()。join() 可加超時參數 join(millis) 防止無限等待。isAlive() 做線程狀態監控與決策。CountDownLatch、CyclicBarrier、CompletableFuture 等工具類。深入理解這些底層控制方法,是編寫健壯並發程序的基石。