7 什么是线程中断
2019-01-18 本文已影响0人
Dream_Lin
线程中断
线程中断指的是线程的一种状态,中断不是自发产生的,而是其它线程发出的一种指令.本线程通过判断是否接收中断指令,来对其它线程发出的中断指令做具体的响应.
sleep
方法和中断
调用sleep
方法的时候,sleep
方法可能会抛出一个中断异常,这是因为sleep
方法内部会不断的去判断是否收到中断指令,一旦收到,则方法内部立即抛出InterruptException
.但其实是否收到中断指令是可以主动调用方法去判断的,只不过sleep
方法内部已经实现这段逻辑.当线程被其它线程中断之后,后续该如何响应中断由本线程负责,中断是线程间的一种约定.
代码实例1
/**
* 开启一个睡眠五秒的子线程,一秒过后主线程向它发出中断指令,则那个线程实际上只睡眠了一秒,因为在睡眠过程中收到中断命令
*/
public class SleepInterruptDemo {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new TaskA());
thread.start();
Thread.sleep(1000);
thread.interrupt();
}
}
class TaskA implements Runnable {
@Override
public void run() {
long beginTime = System.currentTimeMillis();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("被中断了--");
}
System.out.println("睡眠时间:" + (System.currentTimeMillis() - beginTime) / 1000 + "秒");
}
}
思考
假如子线程在sleep
方法期间没有收到中断指令,那么后续再收到中断指令,程序会抛出异常或是做其它工作吗?答案是不会发生任何事.因为sleep
方法的内部调用了Thread.interrupted
去判断是否收到中断指令,既然sleep
方法已经执行完毕,那么就不会再执行到sleep
方法内部判断中断指令的逻辑了要判断是否收到中断指令,就需要主动调用Thread.interrupted
方法去判断是否收到中断指令.
代码验证
/**
* 子线程主动判断是否收到中断指令
*/
public class CheckInterruptStatusDemo {
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(new TaskA());
thread.start();
Thread.sleep(3000);
thread.interrupt();
}
}
class TaskA implements Runnable {
@Override
public void run() {
//在收到中断指令前,sleep已经执行完毕
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
//此处在本程序,不会被执行
System.out.println("sleep被中断");
}
while (true) {
System.out.println("等待!");
/* 主动判断是否接收到中断指令*/
if (Thread.interrupted()) {
System.out.println("被中断 准备退出!");
return;
}
}
}
}