java线程中断interrupted 方法

stop()方法在现在JDK中不推荐使用,原因是stop()方法过于暴力,强行把执行到一半的线程终止,可能会引起一些数据不一致的问题 

在使用线程中,如果需要中断线程,不建议使用在线程内部定义一个Boolean 然后在外边改变它的值的方式。

因为这种方式,如果线程中存在 wait或者sleep等 会被操作系统挂起的方法,即使在外部改变了Boolean的值,线程也不会感知到。

如果有这种需求建议使用线程的interrupted 方法,然后在线程内部调用 isInterrupted判断是否被中断。

isInterrupted有两个方法,一个是isInterrupted方法,这种的不会将interrupted 的值重置为false

还有一种是静态的Thread.interrupted方法,这种的会将interrupted 的值重置为false

 

public static void main(String[] args) throws InterruptedException {
    MyThread myThread = new MyThread();
    myThread.start();
    Thread.sleep(5000);
    myThread.interrupt();
}

private static class MyThread extends Thread {
    @Override
    public void run() {
        String threadName = Thread.currentThread().getName();
        System.out.println("1 interrupt is" + isInterrupted());
        while (!Thread.interrupted()) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                /**
                 *  如果线程处于挂起状态时收到了interrupt信号,会抛出一个InterruptedException异常,
                 * 并且重置interrupt,此时我们在捕获这个异常之后可以手动的设置interrupt,从而使得
                 * 下次循环时判断到已经被中断了,退出线程。
                 * 这样的好处是,不会像调用stop一样,直接中断,导致线程中中断位置之后的代码得不到
                 * 运行,而导致的结果跟预期不一样。
                 */
                interrupt();
                e.printStackTrace();
            }
            System.out.println("2 interrupt is" + isInterrupted());
        }
    }
}

如果用的不是extends Thread 方式创建线程,而是使用的implements Runable方式,可以使用

Thread.currentThread().sInterrupted()代替。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值