在 Java 並發編程中,線程控制是核心基石。本文將系統講解 join()、守護線程、sleep()、yield() 以及線程優先級這五大關鍵機制,並附帶完整代碼示例,助你掌握線程協作與調度的精髓。
join() 允許一個線程等待另一個線程執行完畢。常見場景:主線程將大任務拆分為多個子線程並行執行,需等所有子線程完成後再匯總結果。
join():無限期等待目標線程結束join(long millis):最多等待指定毫秒數join(long millis, int nanos):精確到納秒級等待(極少使用)public class JoinDemo extends Thread {
public JoinDemo(String name) { super(name); }
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
new JoinDemo("子線程-A").start();
for (int i = 0; i < 100; i++) {
if (i == 20) {
JoinDemo jt = new JoinDemo("被join線程");
jt.start();
try { jt.join(); } // 主線程阻塞,直到 jt 結束
catch (InterruptedException e) { e.printStackTrace(); }
}
System.out.println(Thread.currentThread().getName() + " " + i);
}
}
}
執行現象:當 i=20 時主線程阻塞,僅剩「子線程-A」與「被join線程」並行;待後者結束,主線程才恢復執行。
public class DaemonDemo extends Thread {
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
System.out.println(getName() + " " + i);
}
}
public static void main(String[] args) {
DaemonDemo dt = new DaemonDemo();
dt.setDaemon(true); // 設置為守護線程
dt.start();
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + " " + i);
}
// main 結束 → 守護線程 dt 強制終止,無法跑完 1000 次循環
}
}
sleep() 讓**當前線程**進入阻塞狀態指定時間,然後回到就緒狀態等待調度;不釋放鎖。常用於定時任務、限流等場景。
sleep(long millis):毫秒級休眠sleep(long millis, int nanos):納秒級補充(極少用)注意:實際休眠時間受系統計時器精度影響,可能超過指定時間。
public class SleepDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println("當前時間:" + new Date());
try { Thread.sleep(1000); }
catch (InterruptedException e) { e.printStackTrace(); }
}
}
}
public class YieldDemo extends Thread {
public YieldDemo(String name) { super(name); }
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName() + " " + i);
if (i == 20) Thread.yield(); // 禮讓
}
}
public static void main(String[] args) {
YieldDemo high = new YieldDemo("高優先級");
high.setPriority(Thread.MAX_PRIORITY);
high.start();
YieldDemo low = new YieldDemo("低優先級");
low.setPriority(Thread.MIN_PRIORITY);
low.start();
// 高優先級線程 yield 時,不會讓給低優先級線程
}
}
NORM_PRIORITY)MAX_PRIORITY(10)、MIN_PRIORITY(1)、NORM_PRIORITY(5)thread.setPriority(Thread.MAX_PRIORITY); // 推薦
// thread.setPriority(10); // 不推薦
| 方法 | 狀態轉換 | 釋放鎖 | 典型用途 |
|---|---|---|---|
| join() | 運行→阻塞 | 否 | 線程合併、結果匯總 |
| sleep() | 運行→阻塞 | 否 | 定時任務、限流 |
| yield() | 運行→就緒 | 否 | 禮讓 CPU、測試併發 |
| setPriority() | 無狀態變化 | 否 | 調度提示 |
掌握這五大機制,配合 synchronized、Lock 等同步工具,即可構建高效、可控的 Java 並發程序。