怎么理解JAVA线程的中断

1.中断状态是什么?
每个线程都有一个boolean类型的中断状态,当中断线程时,这个线程的中断状态将被设置成true。但是,这并不意为着线程将会马上终止–中断操作并不会真正的中断一个正在运行的线程,而只是发出中断请求,然后线程在下一个合适的时刻中断自己(取消点)。
2.boolean interrupt() 请求中断
interrupt()方法会将调用该方法的线程的中断状态设置为true。
如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个 InterruptedException。----即,当线程在调用上述方法时,接受到中断请求之后,这些方法将抛出一个InterruptedException异常告诉方法调用者,有‘人’尝试中断我,你应该对此作出反应。在这之前,它将把中断状态设置为false(阻塞操作将会被取消,但线程不会被中断)。
//源码
 public void interrupt() {
        //检查当前线程是否有权限中断目标线程
        if (this != Thread.currentThread())
            checkAccess();

        synchronized (blockerLock) {
            Interruptible b = blocker;
            if (b != null) {
                interrupt0();           // Just to set the interrupt flag
                b.interrupt(this);//推断该方法用于真正中断一个线程
                return;
            }
        }
        interrupt0();
    }
3.boolean isInterrupted() 返回中断状态
返回调用线程的中断状态
//源码
public boolean isInterrupted() {
        return isInterrupted(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);
4.static boolean interrupted() 查询线程的中断状态,并清除其中断状态
测试当前线程是否已经中断。线程的中断状态 由该方法清除。换句话说,如果连续两次调用该方法,则第二次调用将返回 false(在第一次调用已清除了其中断状态之后,且第二次调用检验完中断状态前,当前线程再次中断的情况除外)。
由于interrupted()方法会清除线程的中断状态,所以对于调用该方法返回true的线程应该格外小心----你应该处理这个中断状态:抛出一个InterruptedException或者调用当前线程的interrupt()方法使它重新处于中断状态,而不是忽视这个信息。
 public static boolean interrupted() {
        return currentThread().isInterrupted(true);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值