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

《Java 並發編程實戰》第 6 章:線程中斷機制深度解析

     編輯:Java 綜合教學

《Java 並發編程實戰》第 6 章:線程中斷機制深度解析

線程中斷是協作式機制:interrupt() 僅發出請求,目標線程需在合適時機自行響應並退出。本文講解兩種標準處理模式,並給出「限時運行任務」實戰範例。

中斷響應的兩種標準做法

  1. 傳遞異常:捕獲 InterruptedException 後在方法簽名上拋出,調用者決定如何處理。
  2. 恢復中斷狀態:捕獲後調用 Thread.currentThread().interrupt() 重置標誌位,保證上層代碼仍能感知中斷。

實戰:限時運行任務框架

需求:在指定超時內執行任務,無論任務是否響應中斷,超時即強制返回結果或異常。

public class TimeCount {
    private static final ScheduledExecutorService cancelExec = Executors.newSingleThreadScheduledExecutor();

    public static void timedRun(final Runnable r, long timeout, TimeUnit unit) throws Throwable {
        class RethrowableTask implements Runnable {
            private volatile Throwable t;
            public void run() {
                try { r.run(); } catch (Throwable e) { this.t = e; }
            }
            void rethrow() throws Throwable { if (t != null) throw t; }
        }

        RethrowableTask task = new RethrowableTask();
        final Thread taskThread = new Thread(task);
        taskThread.start();

        // 超時中斷
        cancelExec.schedule(() -> taskThread.interrupt(), timeout, unit);

        // 等待任務結束,最多等待超時時間
        taskThread.join(unit.toMillis(timeout));

        // 拋出任務異常或正常返回
        task.rethrow();
    }
}

關鍵點解析

  • ScheduledExecutorService 替代舊版 Timer,支援線程池、異常處理更健壯。
  • join(timeout) 確保主線程不會無限阻塞,超時即繼續執行。
  • volatile Throwable t 保證異常跨線程可見性。
  • 任務若不響應中斷(無 InterruptedException 拋出點),超時後仍會因 join 返回而繼續,調用者可選擇記錄日誌、補償邏輯等。

最佳實踐建議

  1. 阻塞方法(sleep、wait、BlockingQueue)天然響應中斷,拋出 InterruptedException。
  2. 計算密集型任務需主動檢查 Thread.interrupted() 並拋出異常或返回。
  3. 捕獲 InterruptedException 後不要吞掉,必須傳遞或恢復中斷狀態。

掌握中斷協作模式,是編寫可靠、可取消、可超時控制的並發程序基石。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved