run() 自然結束。while(true) 循環),需外部干預停止。stop() 強制終止線程並**立即釋放所有鎖**,導致數據不一致:
// 寫線程修改對象一半時被 stop(),讀線程讀到半修改狀態
synchronized(student) {
student.setId(5);
Thread.sleep(1000); // 此處被 stop()
student.setName("5");
}
運行結果出現 Student[id=5, name=8] 等錯誤數據。JDK 已標記 stop() 為過時,嚴禁生產使用。
private volatile boolean running = true;
public void run() {
while (running) { // 讀取 volatile 變量,保證可見性
// do work
}
}
public void shutdown() {
running = false;
}
優點:簡單、響應及時。缺點:無法中斷阻塞調用(sleep()、wait()、IO)。
thread.interrupt():設置中斷標誌;若線程處於阻塞態(sleep/wait/join),拋出 InterruptedException 並**清除標誌**。thread.isInterrupted():檢查標誌,**不清除**。Thread.interrupted():靜態方法,檢查**當前線程**標誌並**清除**。public void run() {
while (!Thread.currentThread().isInterrupted()) { // 檢查標誌
try {
TimeUnit.SECONDS.sleep(1); // 可中斷阻塞
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新設置標誌,傳遞中斷信息
break; // 或拋出異常向上傳播
}
}
// 清理資源
}
| 特性 | stop() | interrupt() |
|---|---|---|
| 立即終止 | 是 | 否(通知機制) |
| 釋放鎖時機 | 立即 | 由線程自行控制(在 finally 中釋放) |
| 數據一致性 | 破壞 | 保護(線程決定何時安全退出) |
| 阻塞響應 | 無效 | 拋出 InterruptedException 唤醒 |
InterruptedException 後**重新設置中斷標誌**或**拋出異常**,保持中斷鏈路完整。Thread.interrupted()。ExecutorService.shutdownNow() 批量中斷線程池任務。