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

Java 安全終止線程的三種正確姿勢:標誌位、中斷與阻塞處理

     編輯:Java 相關知識

棄用方法警示

Thread.stop()、suspend()、resume()、runFinalizersOnExit() **極度不安全**,已棄用,**嚴禁使用**。

三種安全終止模式

1. 正常跑完(適用於短命任務)

run() 方法自然結束,線程自動終止。

2. 輪詢標誌位(適用於主動循環任務)

volatile boolean finished = false;

public void run() {
    while (!finished) {
        doWork();
        try { Thread.sleep(10000); }
        catch (InterruptedException e) { break; } // 也可作為中斷點
    }
}

// 外部呼叫
public void shutdown() { finished = true; }

關鍵點:volatile 保證可見性;sleep 期間拋出 InterruptedException 亦可跳出。

3. 中斷阻塞操作(適用於 I/O、隊列等阻塞調用)

public void run() {
    try {
        while (true) {
            // BlockingQueue.take() 會阻塞
            Response msg = queue.take();
            process(msg);
        }
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt(); // 重設中斷狀態(良好習慣)
        // 或直接 break/return
    }
}

// 外部終止
thread.interrupt(); // 使 queue.take() 拋出 InterruptedException

原理:interrupt() 設定線程中斷狀態;標準阻塞方法(sleep、wait、join、BlockingQueue、Selector、Channel 等)檢測到中斷即拋出 InterruptedException,給代碼機會清理並退出。

最佳實踐清單

  • 優先用 ExecutorService + Future.cancel(true) 管理生命週期。
  • 捕獲 InterruptedException 後,**務必重設中斷旗標**(Thread.currentThread().interrupt())或拋出,避免吞噬中斷信號。
  • 非阻塞循環用 volatile boolean 標誌;阻塞調用依賴 interrupt()。
  • 永遠不調用 stop()/suspend()/resume()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved