Java中断线程

“结庐在人境,而无车马喧”
在Java中,有3种方式来停止线程:

  1. 正常退出,就是当run()方法执行完毕;

  2. 使用stop()方法强行停止,但是这种方法在后来的Java版本中已经被弃用了,因为使用它可能会造成不可预知的结果;

  3. 使用interrupt()方法中断线程;

    在这里,我们来看看第三种中断线程方法:

MyThread myThread = new MyThread();
myThread.start();   //启动线程
myThread.interrupt();   //中断线程

代码看起来很简单,直接使用MyThread.interrupt()即可;但是我们怎么知道线程有没有中断呢?
刚好Java提供了两个方法来判断线程是否已经被中断:interrupted()和isInterrupted;
这两个方法的使用也很简单,直接返回true或者false

System.out.println(myThread.interrupted());
System.out.println(myThread.isInterrupted());

那么这两个方法既然都能判断线程是否已经中断,它们两个有什么区别呢?
先来看看interrupted()方法在源码里是怎么描述的:
这里写图片描述
这里说的是,该方法用来测试当前线程是否被中断,并且再次调用该方法时,会返回false,因为此方法在调用一次后会清除它的终端状态;也就是下面测试的这种效果:
这里写图片描述
理论上这里应该输出两个true,但是这里却输出两个false.这又是为什么呢?
刚才在源码里也看到了,interrupted()这个方法中断的是当前线程,我这里测试的当前线程指的是main方法,然而我们调用中断方法的线程是MyThread,并不是main,所以实际上当前线程并没有被中断,所以这里返回两个false;
那我们来是这中断当前线程看是什么结果:
这里写图片描述
这里第一次返回了true,说明此时线程已经被中断了;第二次返回了false,是因为该方法会重置线程的中断状态;
再来看看isInterrupted方法:
这里写图片描述
说明这个方法不会重置线程的中断状态;测试一下:
这里写图片描述
返回了两个true,正好说明了中断的状态没有改变;
总结一下:
interrupted():用来判断当前线程的中断状态,并且在调用之后会清除线程的中断状态;
isInterrupted():判断线程Thread对象的中断状态,但是不会清除状态;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值