中断线程的方式有哪些 ?

本文介绍了Java中三种线程中断方式:自定义中断标志、interrupt()方法和已弃用的stop()方法。自定义中断标志虽直观但不及时,interrupt()方法是推荐做法,允许线程控制行为,而stop()因粗暴可能导致资源问题。
摘要由CSDN通过智能技术生成

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

  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();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_hl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值