调用Thread.sleep()与*中断状态*设置?

Rol*_*and 13 java multithreading thread-safety

Java文档在这一点上并不清楚.如果调用Thread.sleep()之前调用Thread上的中断会发生什么:

        //interrupt reaches Thread here
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            return;
        }
Run Code Online (Sandbox Code Playgroud)

是否会抛出InterruptedException

请指向相关文档.

Tom*_*son 11

是的,它会抛出异常.根据Thread.sleep的javadoc ,方法:

抛出:InterruptedException - 如果有任何线程中断了当前线程.抛出此异常时,将清除当前线程的中断状态.

在这种情况下,'has'是指称中断状态的非正式方式.令人遗憾的是它是非正式的 - 如果某个地方的规范应该是精确和明确的,那么它无处不在,但它首先是线程原语.

中断状态机制一般工作的方式是,如果一个线程在不可中断的情况下收到中断(因为它正在运行),那么中断基本上是等到线程中断,此时它突然导致InterruptedException的.这是该机制的一个例子.


Bof*_*ain 7

一个线程可以在任何时间点被中断,但它不会有任何影响,直到该线程具体检查其中断状态Thread.currentThread().isInterrupted()或当它到达,或者是已经阻止通过向呼叫Thread.sleep(long),Object.wait(long)或抛出其他标准JDK方法InterruptedException例如作为java.nio包中的那些.当您捕获InterruptedException或明确调用时,线程的中断状态会被重置Thread.interrupted()(请参阅该难以捉摸的方法的文档).

这篇JavaSpecialists文章应该更多地解释线程中断如何工作以及如何正确处理它们.

  • *“当您捕获 InterruptedException 时,线程的中断状态将被重置”* - 不完全是。根据 javadoc,当异常被抛出时状态被清除,而不是被捕获时状态被清除。(这实际上意味着“ throw”语句*之前*......或者在本例中,相当于“ throw”的本机代码。) (2认同)