1. 程式人生 > >執行緒基礎3 執行緒中斷

執行緒基礎3 執行緒中斷

已經過時的方法:

  1. 暫停 suspend()
  2. 恢復 resume()
  3. 停止 stop()

過時原因:

suspend()方法在呼叫後,執行緒不會釋放已經佔有的資源(比如鎖),而是佔有著資源進入睡眠狀態,這樣容易引發死鎖問題。stop()方法在終結一個執行緒時不會保證執行緒的資源正常釋放。

 

執行緒中斷的三個方法:

  • interrupt()             :中斷執行緒
  • interrupted()         :清除中斷標示
  • isInterrupted()      :返回執行緒中斷狀態

注意:

  1. 執行緒在阻塞的時候才會響應中斷 (比如當前執行緒Thread.sleep(100)的時候)
  2. 執行緒的interrupt() 方法會丟擲一個InterruptedException 並且會清除當前執行緒的的中斷標示
  3. 執行緒的呼叫 interrupt()中斷後 再呼叫清除方法 interrupted() 第一次會返回true 第二次會false
public class ThreadStop extends Thread {
    @Override
    public void run() {
        try {
            System.out.println("1初始中斷狀態:" + this.isInterrupted());
            this.interrupt(); // 呼叫中斷
            System.out.println("2呼叫後中斷狀態" + this.isInterrupted());
            System.out.println("3清除中斷標記" + interrupted());
            System.out.println("4清除中斷標記後中斷狀態" + this.isInterrupted());
            this.interrupt(); // 因為清除了中斷標記執行緒不會再中斷  所以再次呼叫中斷
            System.out.println("5呼叫interrupt後中斷狀態" + this.isInterrupted());
            Thread.sleep(100);// 阻塞響應中斷
            System.out.println("6當前文字不列印因為執行緒已經中斷");
        } catch (InterruptedException e) {
            System.out.println("7執行緒被終止了InterruptedException 會清除中斷標記 狀態為" + this.isInterrupted());
        }
    }
    public static void main(String[] args) {
        ThreadStop ts = new ThreadStop();
        ts.start();
    }
}

 

執行結果:

1初始中斷狀態:false
2呼叫後中斷狀態true
3清除中斷標記true
4清除中斷標記後中斷狀態false
5呼叫interrupt後中斷狀態true
7執行緒被終止了InterruptedException 會清除中斷標記 狀態為false

執行緒的中斷可以讓程式設計師自定義的處理中斷從而可以更加靈活的處理當前執行緒中斷時需要處理的資源和業務邏輯 

 

除了jdk自帶的執行緒中斷我們也可以定義一個volatile 變數來標示當前執行緒是否要中斷比如

public class ThreadStop extends Thread {

    public static volatile boolean isInterrupte = false;

    @Override
    public void run() {
        if(!isInterrupte){ 
            System.out.println("--");
        }
    }

    public static void main(String[] args) {
        ThreadStop ts = new ThreadStop();
        ts.start();
    }
}