Thread.stop():已棄用。強制釋放所有鎖,導致物件處於不一致狀態,極難除錯。Thread.interrupt():不會直接停止執行中執行緒,僅設定「中斷狀態」旗標;若執行緒處於阻塞(sleep/wait/join),會拋出 InterruptedException 並清除旗標。class Worker extends Thread {
private volatile boolean stop = false; // volatile 保證可見性
public void run() {
while (!stop) {
// 執行工作單元
doWork();
}
cleanup(); // 釋放資源、關閉連線
}
public void requestStop() { stop = true; }
}
// 使用
Worker w = new Worker();
w.start();
// ... 某時刻需停止
w.requestStop(); // 設旗標
w.join(); // 等待優雅結束
volatile 確保寫入對其他執行緒立即可見。class BlockingWorker extends Thread {
private volatile boolean stop = false;
public void run() {
while (!stop) {
try {
Thread.sleep(1000); // 可能阻塞
doWork();
} catch (InterruptedException e) {
// 被中斷喚醒,檢查旗標決定是否退出
if (stop) break; // 或直接 return
}
}
}
public void requestStop() {
stop = true;
interrupt(); // 打斷 sleep/wait/join
}
}
關鍵:catch (InterruptedException) 內必須重新檢查停止條件或拋出/保留中斷狀態(Thread.currentThread().interrupt()),不可直接忽略。
class Worker extends Thread {
static volatile boolean stopAll = false; // static 共享
// ...
}
// 主程式
Worker.stopAll = true; // 一次通知所有實例
for (Worker w : workers) w.interrupt();
stop()、suspend()、resume()、destroy()。volatile boolean 旗標控制運算迴圈。sleep/wait/BlockingQueue.take)配合 interrupt() 喚醒。catch (InterruptedException) 時:要么退出,要么重設中斷旗標(Thread.currentThread().interrupt())。shutdown() 方法封裝「設旗標 + interrupt + join」邏輯,對外暴露優雅關閉介面。ExecutorService.shutdown()/shutdownNow() 管理執行緒池生命週期。