程式碼中 main 啟動一個新執行緒跑無限迴圈,問題:「執行會產生幾條執行緒?」
main 方法。new Thread(...).start() 顯式建立並啟動。public static void main(String[] args) {
// 主執行緒從這裡開始
new Thread(new Runnable() {
public void run() {
while (true) { // 死循環
int i = 0;
System.out.println(Math.random());
System.out.println(++i); // 每次重置為 1
System.out.println(Thread.currentThread().getName());
}
}
}).start(); // 啟動子執行緒
// 主執行緒執行完 main 方法後結束
// 但 JVM 不會退出,因為仍有非守護執行緒 (子執行緒) 存活
}
| 問題 | 影響 | 修正建議 |
|---|---|---|
while(true) 無退出條件 | 子執行緒永不結束,JVM 永不退出 | 加入 volatile boolean running 控制迴圈,或設為守護執行緒 setDaemon(true) |
int i = 0 在迴圈內 | 每次迴圈重置,++i 永遠輸出 1 | 移至迴圈外 int i = 0; while(...) { System.out.println(++i); } |
無 Thread.sleep | 佔滿 CPU 核心,導致系統卡頓 | 迴圈內加 Thread.sleep(1000) 降低頻率 |
public class Worker implements Runnable {
private volatile boolean running = true;
private int counter = 0;
public void stop() { running = false; }
@Override
public void run() {
while (running) {
System.out.println(Thread.currentThread().getName() + ": " + ++counter);
try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); break; }
}
}
}
public static void main(String[] args) throws InterruptedException {
Worker worker = new Worker();
Thread t = new Thread(worker, "MyWorker");
t.start();
Thread.sleep(5000); // 主執行緒做其他事 5 秒
worker.stop(); // 通知子執行緒優雅退出
t.join(); // 等待子執行緒結束
System.out.println("程式正常結束");
}
t.setDaemon(true):主執行緒結束時 JVM 強制終止守護執行緒,**不執行 finally/finalize**,資料可能遺失。理解「main 執行緒 + 顯式 new Thread = 2 條執行緒」,並掌握優雅啟動/停止模式,是 Java 多執行緒編程的入門必修課。