线程中断的概念
- Java中线程中断是一种协作机制
- 通过中断并不能直接终止线程的运行
- 需要被中断的线程自己处理中断
- 每个线程有一个boolean类型的标志位,代表线程是否中断
线程中断相关方法
- public void interrupt();将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。
- public static boolean interrupted();测试当前线程是否已经中断。线程的中断状态由该方法清除。
- public boolean isInterrupted();测试线程是否已经中断。线程的中断状态不受该方法的影响。
/**
* @description: 线程的中断
* @author: Cyril
* @create: 2019/11/04
*/
public class InterruptDemo {
public static void main(String[] args) {
// 线程是否被中断
System.out.println("1: " + Thread.interrupted());
// 设置线程中断,将调用该方法的对象所表示的线程标记一个停止标记,并不是真的停止该线程。
Thread.currentThread().interrupt();
// 线程是否被中断,静态方法interrupted()会将当前线程的中断状态清除。
System.out.println("2: " + Thread.interrupted());
// 线程是否被中断,如果连续两次调用该方法,则第二次调用将返回 false。
System.out.println("3: " + Thread.interrupted());
}
}
/**
* @description: 判断线程是否中断,不清除中断状态
* @author: Cyril
* @create: 2019/11/04
*/
public class IsInterruptedDemo {
public static void main(String[] args) {
// 当前线程
Thread thread = Thread.currentThread();
// 当前线程是否被中断 false
System.out.println("1: " + thread.isInterrupted());
// 设置线程中断标识
thread.interrupt();
// 判断线程是否被中断 true
System.out.println("2: " + thread.isInterrupted());
// 判断线程是否被中断 true
System.out.println("3: " + thread.isInterrupted());
try {
// 线程休眠
Thread.sleep(2000);
System.out.println("not interrupted...");
} catch (Exception e) {
System.out.println("Thread.sleep interrupted...");
// 判断线程是否被中断 false
// 为什么为false呢?因为调用Thread.sleep(2000)时,线程已经中断,这时相当于重新响应线程,所以为false;
System.out.println("4: " + thread.isInterrupted());
//如果捕获了异常,异常交给上层处理,需要重新设置中断异常标识位
Thread.currentThread().interrupt();
}
// 判断线程是否被中断
System.out.println("5: " + thread.isInterrupted());
}
}
常见误区
被中断的线程将立刻退出运行,这句话是错误的,好比杀毒软件正在杀毒时,我们点击取消按钮,杀毒就会立即停止吗?