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

Java 線程中斷機制深度解析:stop()、interrupt()、isInterrupted() 與 interrupted()

     編輯:Java 相關知識

線程終止的三種方式

  1. 正常結束: run() 方法執行完畢自然退出。
  2. 強制終止(已棄用): Thread.stop()。
  3. 協作式中斷(推薦): interrupt() + 中斷狀態檢查。

為什麼 stop() 被棄用?

源碼註釋明確指出:

  • 釋放所有鎖: 拋出 ThreadDeath 錯誤導致鎖非正常釋放,被保護的共享數據可能處於不一致狀態(如轉賬扣款成功但入賬失敗)。
  • 不可控: 可能在任意字節碼指令處終止,破壞不變性。
  • 替代方案: 使用 volatile boolean 標誌位或 interrupt() 通知線程自行退出。

中斷機制核心 API

1. Thread.interrupt()

實例方法,設置目標線程的中斷狀態為 true。若線程處於阻塞狀態(sleep()、wait()、join()、I/O),將拋出 InterruptedException 並**清除中斷狀態**;否則僅設置標誌位。

2. Thread.interrupted()

靜態方法,檢查**當前線程**(調用線程)的中斷狀態,**並清除該狀態**。連續調用兩次第二次返回 false(除非再次被中斷)。

3. Thread.isInterrupted()

實例方法,檢查**該線程對象代表的線程**的中斷狀態,**不清除狀態**。

源碼對比

// Thread.java
public static boolean interrupted() {
    return currentThread().isInterrupted(true);  // true = 清除狀態
}

public boolean isInterrupted() {
    return isInterrupted(false); // false = 不清除
}

private native boolean isInterrupted(boolean ClearInterrupted);

關鍵差異總結表

方法屬於檢查對象清除狀態典型用途
interrupt()實例目標線程否(設置為 true)發起中斷請求
interrupted()靜態當前線程是在當前線程中輪詢/消費中斷
isInterrupted()實例指定線程否外部監控線程狀態

實戰示例

public class InterruptDemo {
    static class Worker extends Thread {
        @Override public void run() {
            while (!Thread.currentThread().isInterrupted()) { // 檢查標誌位
                try {
                    Thread.sleep(1000); // 阻塞點可響應中斷
                } catch (InterruptedException e) {
                    // 睡眠被中斷,異常拋出時狀態已被清除
                    // 重新設置標誌位以便外層循環檢測
                    Thread.currentThread().interrupt();
                    break;
                }
            }
            System.out.println("Worker 線程安全退出");
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Worker w = new Worker();
        w.start();
        Thread.sleep(3000);
        w.interrupt(); // 發起中斷
        w.join();
        System.out.println("主線程結束");
    }
}

最佳實踐原則

  1. 不忽略 InterruptedException: 捕獲後應重新設置中斷狀態(Thread.currentThread().interrupt())或拋出異常。
  2. 定期檢查標誌位: 長時間計算循環中調用 Thread.currentThread().isInterrupted()。
  3. 使用高級併發工具: Future.cancel(true)、ExecutorService.shutdownNow() 內部封裝了中斷邏輯。
  4. 絕不使用 stop()/suspend()/resume(): 這些方法從 JDK 1.2 起即標記 @Deprecated。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved