Java线程中断学习笔记

中断:代表线程的一种状态,值为true或false。默认为false,代表没有被中断。

// Thread 类中的实例方法,持有线程实例引用即可检测线程中断状态
public boolean isInterrupted() {}

// Thread 中的静态方法,检测调用这个方法的线程是否已经中断
// 注意:这个方法返回中断状态的同时,会将此线程的中断状态重置为 false
// 所以,如果我们连续调用两次这个方法的话,第二次的返回值肯定就是 false 了
public static boolean interrupted() {}

// Thread 类中的实例方法,用于设置一个线程的中断状态为 true
public void interrupt() {}

如果一个线程在等待期间,同时发生了通知和中断,有两种情况:

  • 从 wait 方法中正常返回,同时不改变中断状态(也就是说,调用 Thread.interrupted 方法将会返回 true)

  • 由于抛出了 InterruptedException 异常而从 wait 方法中返回,中断状态设置为 false

第一种情况发生的条件是:线程先被notify,移出等待集合,然后再被interrupt中断。此时线程从wait方法返回后不会抛出中断异常,但可以通过Thread.interrupted()判断是否中断过。

第二种情况:线程在等待集合中被中断了,然后在被通知移出等待集合后,发现自己被中断了,接着在获得监视器锁之后,再抛出异常。也就是说即使被中断,也不会立即抛出异常。

注意:如果一个线程同时被中断和通知唤醒,同时这个线程通过抛出 InterruptedException 异常从 wait 中返回(对应第二种情况),那么等待集合中的某个其他线程一定会被通知。所以此时中断也具有了notify的作用。

InterruptedException 概述

它是一个特殊的异常,不是说 JVM 对其有特殊的处理,而是它的使用场景比较特殊。

通常,我们可以看到,像 Object 中的 wait() 方法,ReentrantLock 中的 lockInterruptibly() 方法,Thread 中的 sleep() 方法等等,这些方法都带有 throws InterruptedException,我们通常称这些方法为阻塞方法(blocking method)。

阻塞方法一般情况下运行时间较长,且其方法结束需要依赖外部条件(如notify、unlock)。当我们看到方法上带有throws InterruptedException时,我们就要知道,这个方法应该是阻塞方法,我们如果希望它能早点返回的话,我们往往可以通过中断来实现。

参考

深入分析 Java 8 编程语言规范:Threads and Locks

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值