在Java多線程編程中,正確理解線程生命周期並掌握安全停止線程的方法至關重要。本文針對一個典型的while(flag)循環線程,分析其結束後的狀態,並給出最佳實踐方案。
private boolean flag = true;
new Thread(new Runnable() {
public void run() {
while (flag) {
try {
Thread.sleep(1000);
System.out.println("輸出");
} catch (InterruptedException e) {
// 忽略中斷異常
}
}
}
}).start();
問題:當while循環條件flag變為false導致循環結束後,該線程是否仍在運行?
線程會正常終止。 當run()方法執行完畢(即循環結束後無後續代碼),線程自動進入TERMINATED(終止)狀態,不再佔用CPU資源,也無需手動調用stop()等已棄用方法。
flag聲明為volatile boolean flag = true;,保證線程間可見性。public void stopThread() {
flag = false;
}
InterruptedException後應重新設置中斷標誌或退出循環,避免吞噬中斷信號。
catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新設置中斷標誌
break; // 或返回
}
Thread.stop()、suspend()、resume()已被棄用,會導致鎖釋放不一致、數據損壞等嚴重問題。NEW → RUNNABLE(start()) → RUNNING(獲取CPU) ↔ BLOCKED/WAITING/TIMED_WAITING(sleep/wait/join) → TERMINATED(run結束或異常退出)