interrupt相关的几个方法

void interrupt()--调用native方法 private native void interrupt0()

如果线程t因为Object.wait, Thread.join和Thread.sleep三种方法之一处于WAITING状态,其他线程调用t.interrupt()方法时线程t将接收到一个中断异常(InterruptedException),从而提早地终结WAITING状态。

interrupt()只是改变中断状态而已。interrupt()不会中断一个正在运行的线程。这一方法实际上完成的是,给处于WAITING状态的线程抛出一个中断信号,这样线程就得以退出WAITING的状态。

如果线程t没有处于WAITING状态,这时调用interrupt()将不起作用。

线程t在执行t.sleep或者调用其他对象的wait或者其他线程的join方法时,线程tt调用线程t的interrupt方法,的确这一个时候t会有InterruptedException 异常抛出来。但这其实是线程t不断循环检查自身的中断标识位而自己抛出的InterruptedException。如果线程t正在执行一些指定的操作时如赋值,for,while,if,调用方法等,都不会去检查中断状态,所以线程t不会抛出 InterruptedException,而会一直执行着自己的操作。当线程t终于执行t.sleep或者调用其他对象的wait或者其他线程的join方法时,才马上会抛出 InterruptedException。若线程t没有执行t.sleep或者调用其他对象的wait或者其他线程的join方法,即没有在线程里自己检查中断状态自己抛出InterruptedException的话,那InterruptedException是不会被抛出来的

以wait方法为例。线程t进入了对象a的等待队列。此时线程t会不断循环检测自己的中断标识位,如果发现中断状态被置位(设置为true)了。那么线程t要做的就是抛出InterruptedException异常,并从被WAITING状态中跳出来。

boolean isInterrupted() --调用native方法private native boolean isInterrupted(boolean ClearInterrupted);

测试线程是否被终止,这一调用不改变线程的中断状态。

为啥说【这一调用不改变线程的中断状态】?因为其最终调用

/**
 * Tests if some Thread has been interrupted.  The interrupted state
 * is reset or not based on the value of ClearInterrupted that is
 * passed.
 */
private native boolean isInterrupted(boolean ClearInterrupted);

方法。参数 ClearInterrupted 表示是否清除中断标识位。而isInterrupted()方法中调用时ClearInterrupted 为false,即不清除中断标识位。所以说 isInterrupted() 方法并不清除中断标识位,故而【这一调用不改变线程的中断状态】。

static boolean interrupted()--调用native方法private native boolean isInterrupted(boolean ClearInterrupted);

测试当前线程(即正在执行这一命令的线程)是否被中断。这一调用会产生一个副作用——将当前线程的中断状态设置为false。

可以看到最终调用的是

/**
 * Tests if some Thread has been interrupted.  The interrupted state
 * is reset or not based on the value of ClearInterrupted that is
 * passed.
 */
private native boolean isInterrupted(boolean ClearInterrupted);

方法。参数 ClearInterrupted 表示是否清除中断标识位。static boolean interrupted()调用时ClearInterrupted 设置为true,即要清除中断标识位,那么调用后就将中断标识位清除了,就是把中断标识位又设置为了false。

转载于:https://my.oschina.net/u/3866531/blog/2247814

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值