为什么在调用sleep或者wait方法之前改变线程的中断状态,sleep也会抛出异常并将中断状态复位?
之前看到的例子都是在sleep或者wait以后通过interrupt可以使得sleep状态中断,但是如果先使用interrupt改变中断状态再调用sleep也能抛出异常中断,难道sleep或者wait方法会自动检查中断状态么?如果是true就抛出异常么?
应该是sleep等中也做了处理,比较interrupt的优先级比较高
首先,理解中断是主线程给子线程发送的一个信号,需要子线程知道在执行过程中需要中断,而子线程对中断的信号可以处理,也可以不处理。
其次,线程的sleep方法和Object的wait方法在线程休眠期间,会响应中断信号,就是如果在线程休眠期间该线程被其他主线程中断,该方法就会抛出异常给它的调用者。
最后,“sleep或者wait方法会自动检查中断状态么?如果是true就抛出异常么”,是的,线程的中断状态会导致sleep和wait方法抛出异常的。
就是sleep方法的时候会检查线程的中断标识的,如果是中断状态就抛出中断异常,由调用者决策怎么处理中断。下面这个例子就是:子线程休眠5分钟执行一次操作,如果main线程中断了子线程,那子线程监测到后也立即结束。
public class ChildThread extends Thread{
@Override
public void run() {
while (true){
System.out.println("time is:"+new Date());
try {
Thread.sleep(300000);
} catch (InterruptedException e) {
System.out.println("outer has interrupted this thread.");
break;
}
}
}
public static void main(String[] args) {
ChildThread t = new ChildThread();
t.start();
try {
Thread.sleep(100);
System.out.println("主线程休眠0.1秒后中断子线程.");
} catch (InterruptedException e) {
e.printStackTrace();
}
t.interrupt();
}
}
子线程调用sleep操作必须处理中断异常,要么处理要么忽略,要么上抛。