并发编程 - 中断线程的方式有哪些

中断线程有三种方式,如下:

  1. 自定义中断标志位,
  2. 使用 interrup() 方法,(推荐)
  3. 使用 stop() 方法。

1. 自定义中断标志位

自定义中断标注位就是使用了一个标志位来控制线程的执行,当标志位位 true 的时候,线程继续执行,反之,线程退出循环或者执行完当前任务后停止。

public class MyThread extends Thread {
    private volatile boolean flag = true;
    // 中断线程的方法
    public void stopThread() {
        flag = false;
    }
    @Override
    public void run() {
        while(flag) {
            // 业务代码
        }
    }
}

2. 使用 interrupt() 方法

class MyThread extends Thread {
    @Override
    public void run() {
        while (!Thread.currentThread().isInterrupted()) {
            // 业务代码
        }
    }
}
// 中断线程
myThread.interrupt();

第二种方法是官方推荐的写法,因为使用 interrupt 中断线程,他可以自行控制自己的行为:

  • 它可以选择立即退出,
  • 也可以选择稍后退出,
  • 还可以不退出。

具体如何控制,看以下代码:

public static void main(String[] args) throws InterruptedException {
    Thread t = new Thread(() -> {
        while(!Thread.currentThread().isInterrupted()) {
            // 业务代码
            System.out.println("线程运行种...");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                // 1.立即退出 -> break;
                // 2.稍后退出 -> sleep();
                // 3.不退出 -> 啥也不干
            }
        }
    });
    t.start();
    Thread.sleep(1000);
    System.out.println("控制新线程退出!");
    t.interrupt();
}

3. 使用 stop() 方法

stop() 方法可以直接停止线程的运行,由于它太过粗暴了,所以这个方法已经被弃用了。因为如果立即中断线程的话,可以就会导致线程的资源还没有释放就被中断了,从而引发线程安全问题。

public class MyThread extends Thread{
    @Override
    public void run() {
        while(true) {
            // 业务代码
        }
    }
}
// 中断线程
myThread.stop();

你可能感兴趣的:(并发,java,开发语言)