线程中断:是否会取消即将到来的wait()调用?

Nag*_*gyI 12 java concurrency multithreading wait

我有一个具有传入作业队列的线程(LinkedList包含作业说明).wait()当没有工作要做时,线程会阻塞队列.外部作业调度程序对象notify()在将新作业放入队列时将其唤醒.

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

mre*_*mre 11

阅读API规范Thread.interrupt()-

中断此线程.

除非当前线程正在中断自身(始终允许),否则将调用此线程的checkAccess方法,这可能导致抛出SecurityException.

如果在调用Object类的wait(),wait(long)或wait(long,int)方法,或者join(),join(long),join(long,int)方法中阻塞了这个线程,sleep(long)或sleep(long,int),这个类的方法,然后它的中断状态将被清除,它将收到InterruptedException.

如果此线程在可中断通道上的I/O操作中被阻塞,则通道将被关闭,线程的中断状态将被设置,并且线程将收到ClosedByInterruptException.

如果此线程在Selector中被阻塞,则线程的中断状态将被设置,并且它将立即从选择操作返回,可能具有非零值,就像调用选择器的唤醒方法一样.

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

中断不活动的线程不会产生任何影响.

所以,所有这一切都将是线程的中断状态将被设置.

编辑

如果您阅读了API规范Object.wait(),您将看到以下内容 -

抛出:

InterruptedException - 如果任何线程在当前线程等待通知之前或当前线程中断当前线程.抛出此异常时,将清除当前线程的中断状态.


jta*_*orn 10

是的,您的中断线程将在调用wait()时抛出InterruptedException.这对你自己来说非常简单.

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

        synchronized(TestInt.class) {
            TestInt.class.wait();
        }    
    }    
}
Run Code Online (Sandbox Code Playgroud)

另外,请注意javaodc Object.wait():

InterruptedException - 如果任何线程在当前线程等待通知之前或当前线程中断当前线程.抛出此异常时,将清除当前线程的中断状态.