首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 安全中斷執行緒:為什麼不該用 stop()、正確使用 interrupt() 與共享旗標

     編輯:Java 相關知識

錯誤示範:stop() 與 interrupt() 誤區

  • Thread.stop():已棄用。強制釋放所有鎖,導致物件處於不一致狀態,極難除錯。
  • Thread.interrupt():不會直接停止執行中執行緒,僅設定「中斷狀態」旗標;若執行緒處於阻塞(sleep/wait/join),會拋出 InterruptedException 並清除旗標。

正確模式一:volatile 共享旗標(適用於運算中執行緒)

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 確保寫入對其他執行緒立即可見。
  • 執行緒在迴圈頂端檢查旗標,完成當前工作單元後退出。

正確模式二:interrupt() 處理阻塞執行緒

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();

最佳實務清單

  1. 永不使用 stop()、suspend()、resume()、destroy()。
  2. 用 volatile boolean 旗標控制運算迴圈。
  3. 阻塞點(sleep/wait/BlockingQueue.take)配合 interrupt() 喚醒。
  4. catch (InterruptedException) 時:要么退出,要么重設中斷旗標(Thread.currentThread().interrupt())。
  5. 提供 shutdown() 方法封裝「設旗標 + interrupt + join」邏輯,對外暴露優雅關閉介面。
  6. 生產環境優先使用 ExecutorService.shutdown()/shutdownNow() 管理執行緒池生命週期。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved