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使用,否则没有。

发布了25 篇原创文章 · 获赞 9 · 访问量 3051

猜你喜欢

转载自blog.csdn.net/qq_40053836/article/details/100104363