new Thread(),未獲資源,非 alive。start(),進入排程佇列,等待 CPU。sleep()、wait()、I/O 等待,釋放 CPU。run() 結束或異常中止,不可重啟。
t1.start();
while (t1.isAlive()) {
Thread.sleep(100); // 主執行緒休眠
}
t2.start(); // t1 結束後再啟動 t2
缺點:忙碌等待、精度受 sleep 影響、程式碼冗長。
t1.start();
try {
t1.join(); // 當前執行緒等待 t1 結束
} catch (InterruptedException e) {
e.printStackTrace();
}
t2.start();
join()、join(long ms)、join(long ms, int ns) 支援超時。wait() 實作,被中斷會拋 InterruptedException。setDaemon(true) 標記為守護執行緒(需在 start() 前呼叫)。class DaemonTask extends Thread {
public void run() {
for (int i=0; i<100; i++) {
System.out.println("Daemon running: " + i);
try { Thread.sleep(200); } catch (InterruptedException e) {}
}
}
}
public class Demo {
public static void main(String[] args) {
DaemonTask dt = new DaemonTask();
dt.setDaemon(true); // 設為守護執行緒
dt.start();
System.out.println("Main thread ends."); // 主執行緒結束,JVM 關閉,Daemon 立即停止
}
}
| 方法 | 行為 | 鎖狀態 | 適用場景 |
|---|---|---|---|
yield() | 暫停目前執行緒,回到可執行狀態,不保證能讓同優先級執行緒執行 | 持有鎖 | 長時間計算中主動讓出 CPU |
sleep(ms) | 進入阻塞狀態指定時間,不釋放鎖 | 持有鎖 | 定時輪詢、節流 |
注意:同步區塊中避免呼叫 yield(),否則持有鎖導致其他執行緒飢餓。
join() 等待執行緒,而非輪詢 isAlive()。Daemon,避免阻塞 JVM 關閉。ExecutorService(java.util.concurrent)管理執行緒池,手動管理 Thread 僅用於教學或極簡場景。run() 直接處理複雜邏輯,採用 Runnable/Callable 分離任務與執行機制。