java线程中断的问题。

为什么在调用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操作必须处理中断异常,要么处理要么忽略,要么上抛。