中断线程的正确姿势

中断线程的正确姿势

​ suspend、resume、stop方法可以将对应的线程赞同他、恢复、停止,但是现在这些API都不再推荐使用,原因是suspend会占用着资源进入睡眠状态,这样容易引发死锁问题,stop方法在终结一个线程时不会保证线程的资源被正确释放。

​ 要中断一个线程最好的办法时使用线程的interrupt方法,它可以理解为线程的一个标识位属性。其他线程通过调用该线程的interrupt方法来对其进行中断操作,这个方法可以理解为其他线程向该线程打了个招呼“发生中断啦,你该对这个中断进行处理”,而不是强制的让线程停止。

​ 线程可以通过检查自身是否被中断来进行响应,线程通过方法isInterrupted()来进行判断是否被中断,也可以调用静态方法Thread.interrupted()对当前线程的中断标识位进行复位。

​ 如果线程处于Waiting或Blocked等阻塞或是等待状态,那么中断将会导致该线程被唤醒,Java虚拟机对该线程的中断标志位清除,然后抛出InterruptedException。

/*
停止线程的正确姿势
 */
public class Shutdown {
    public static void main(String[] args) throws Exception{
        Runner one = new Runner();
        Thread countThread = new Thread(one,"CountThread");
        countThread.start();
        TimeUnit.SECONDS.sleep(1);
        countThread.interrupt();
        Runner two = new Runner();
        countThread = new Thread(two,"CountThread");
        countThread.start();
        TimeUnit.SECONDS.sleep(1);
        two.cancle();
    }
    private static class Runner implements Runnable{
        private long i ;
        private volatile boolean on = true ;
        @Override
        public void run() {
            while(on && !Thread.currentThread().isInterrupted()){
                i ++ ;
            }
            System.out.println("Count i = " + i);
        }
        public void cancle() {
            on = false ;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值