java併發編程之正確使用 interrupt 中斷線程

在運行的多線程中怎麼正確的中斷該線程呢?今天廢話不多說直面主題,中斷執行的線程。

  1. interrupt() 配合阻塞中斷線程
  2. 異常中斷法

        大家可能有聽說過 interrupt 是用於中斷線程,但是它真的就可以中斷線程嗎?

public class MyInterrupt implements Runnable {

    public static void main(String[] args) {
        new Thread(new MyInterrupt()).start();

    }

    @Override
    public void run() {
        System.out.println("子線程開始執行");
        Thread.currentThread().interrupt();
        System.out.println("子線程沒有停止");
    }

    //運行結果
    //子線程開始執行
    //子線程沒有停止
}

我們可以看到,我們使用interrupt並不能直接使線程中斷。在執行了中斷線程之後,線程還是繼續在執行。怎麼結局呢?

interrupt() 配合阻塞中斷線程

public class MyInterrupt implements Runnable {

    public static void main(String[] args) {
        new Thread(new MyInterrupt()).start();

    }

    @Override
    public void run() {
        System.out.println("子線程開始執行");
        try {
            //阻塞線程
            this.wait();
            Thread.currentThread().interrupt();
            System.out.println("子線程沒有停止");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("我還在執行");
    }
}

執行結果:

從這裏我們就可以看到,這個時候並沒有看到打印後面的語句,那就證明了我們的子線程以及停止了。

異常中斷法

public class MyInterrupt implements Runnable {

    public static void main(String[] args) {
        new Thread(new MyInterrupt()).start();

    }

    @Override
    public void run() {
        System.out.println("子線程開始執行");
        int i = 1 / 0;
        System.out.println("子線程沒有停止");
        System.out.println("我還在執行");
    }
}

運行結果:

從上圖我們也可以清晰的看到,並沒有在控制檯大廳語句,從而證明了我們成功的中斷線程。

 

總結:interrupt()方法需要搭配一個阻塞進行使用,拋出異常也可以成功的中斷線程,但是拋出異常不要配合Try和Catch使用,否則沒有。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章