Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程中断:它会取消即将到来的wait()调用吗?_Java_Multithreading_Concurrency_Wait - Fatal编程技术网

Java 线程中断:它会取消即将到来的wait()调用吗?

Java 线程中断:它会取消即将到来的wait()调用吗?,java,multithreading,concurrency,wait,Java,Multithreading,Concurrency,Wait,我有一个线程,它有一个传入的作业队列(一个包含作业描述的LinkedList)。当没有作业可处理时,线程在队列上用wait()阻塞。当外部作业调度器对象在队列上放置新作业时,它会用notify()唤醒它 程序关闭时,我在线程上调用interrupt()。当线程在wait()中等待作业时,会引发InterruptedException。我的问题是:如果我在线程没有阻塞但正在执行某种工作时中断线程,那么会发生什么情况?已处理的项是队列中的最后一个(因此队列现在为空),并且在设置中断标志之前执行过is

我有一个线程,它有一个传入的作业队列(一个包含作业描述的
LinkedList
)。当没有作业可处理时,线程在队列上用
wait()
阻塞。当外部作业调度器对象在队列上放置新作业时,它会用
notify()
唤醒它


程序关闭时,我在线程上调用
interrupt()
。当线程在
wait()
中等待作业时,会引发
InterruptedException
。我的问题是:如果我在线程没有阻塞但正在执行某种工作时中断线程,那么会发生什么情况?已处理的项是队列中的最后一个(因此队列现在为空),并且在设置中断标志之前执行过
isInterrupted()
检查,这样它会再次调用
wait()
?它是否会抛出一个
InterruptedException
,因为interrupted标志已经设置,或者线程会永远等待,因为新作业永远不会到达队列,并且没有人可以中断等待?

请阅读API规范以了解更多信息-

中断此线程

除非当前线程正在中断自身,否则 如果允许,则调用此线程的checkAccess方法,该方法可能 导致引发SecurityException

如果该线程在wait()的调用中被阻塞,wait(long), 或对象类或join()的wait(long,int)方法, join(long)、join(long,int)、sleep(long)或sleep(long,int)方法 则其中断状态将被清除,并且 接收中断异常

如果此线程在I/O操作中因可中断事件而被阻塞 然后通道将关闭,线程的中断状态 将被设置,并且线程将接收ClosedByInterruptException

如果该线程在选择器中被阻塞,则该线程的中断 将设置状态,并立即从选择返回 操作,可能使用非零值,就像选择器 已调用唤醒方法

如果前面的条件都不成立,则该线程的中断 将设置状态。

中断一个非活动线程不需要有任何效果

因此,将要发生的只是设置线程的中断状态

编辑 如果您阅读了的API规范,您将看到以下内容-

抛出:

InterruptedException-如果任何线程在当前线程等待事件之前或期间中断了当前线程 通知。引发此异常时,当前线程的中断状态将被清除


是的,被中断的线程在调用wait()时将抛出InterruptedException。这是非常简单的测试自己

public class TestInt {
    public static void main(String[] args) throws Exception
    {
        Thread.currentThread().interrupt();

        synchronized(TestInt.class) {
            TestInt.class.wait();
        }    
    }    
}
另外,请注意
Object.wait()
的javaodc:

InterruptedException-如果任何线程在之前或期间中断当前线程 当前线程正在等待通知。电流的中断状态 抛出此异常时,线程被清除


但是,如果在我的代码检查循环中的
isInterrupted()
之后设置了中断状态(因此它会看到“好的,我们还没有被中断”继续),并且在设置了中断状态的情况下再次调用
wait()
,会发生什么?我猜您的意思是,如果我使用此线程
join()
,那么它将在关机时死锁我的应用程序。如果是这样的话,我怎么能避免呢?@Nagyl,我相信当它试图调用
wait()
@Nagyl时,它会抛出一个
InterruptedException
,如果出现这种情况,而您仍然会遇到问题,这可能是因为当您在
wait()
上捕捉到
InterruptedException
时,您需要传播异常(即
Thread.currentThread().interrupt()
),因为中断状态将被清除。实际上,我在项目中还没有遇到这个问题。我只是想知道在编写代码时可能出现的错误,我自己也找不到这个问题的答案。中断传播再次是一件很好的事情,谢谢!为了简洁起见,我最喜欢这个答案。API规范确实提供了回答这个问题所需的详细信息,上面的代码片段确实验证了这一点,但对于答案的简单摘要,我想说:
otherThread
中的代码可以在myThread进入
wait()
之前调用
myThread.interrupt()
。在
myThread
中,围绕
wait()
的try-catch子句将捕获
InterruptedException
。但是,如果在
myThread
中的
wait()
之前的
otherThread中调用了
myObj.notify()
,那么
wait()
将看不到它。将其升级为应答,因为它包含示例代码,可以更清楚地解释行为。