承接上篇,本文聚焦線程阻塞狀態、控制方法、守護線程、優先級與讓步機制,透過代碼實例演示核心行為。
join() — 等待線程終止sleep(ms) — 定時休眠new Thread(r).start(); Thread.sleep(1); 可大概率讓新線程先獲得 CPU 片段。wait()/notify() — 對象監視器等待/通知synchronized 內調用,**釋放鎖**,進入 WAITING。詳見下篇「線程通訊」。public static void main(String[] args) throws InterruptedException {
Thread t = new Thread(() -> {
for (int i = 0; i < 5; i++) { System.out.println("子線程 " + i); sleep(200); }
});
t.start();
System.out.println("主線程等待子線程...");
t.join(); // 阻塞直到 t 結束
System.out.println("主線程繼續");
}
setDaemon(true) 必須在 start() 前調用。Thread daemon = new Thread(() -> {
while (true) { System.out.println("守護執行中"); sleep(500); }
});
daemon.setDaemon(true);
daemon.start();
sleep(2000); // 主線程結束,程序退出,守護線程不再輸出
Thread high = new Thread(() -> { for(int i=0;i<10;i++) System.out.println("H"); });
Thread low = new Thread(() -> { for(int i=0;i<10;i++) System.out.println("L"); });
high.setPriority(Thread.MAX_PRIORITY);
low.setPriority(Thread.MIN_PRIORITY);
high.start(); low.start(); // 輸出順序不確定
Thread.yield():當前線程從 RUNNING → RUNNABLE,重新參與調度。sleep(0) 效果類似,但不進入 TIMED_WAITING。阻塞與控制是多線程協作基石。join 用於等待結果,sleep 用於節流/定時,守護線程 用於輔助任務,**優先級與 yield 僅作提示不可依賴**。下篇將深入「線程安全、同步鎖、wait/notify、生產者消費者」。