Java 当阻塞wait()时线程被中断时会发生什么情况?

Java 当阻塞wait()时线程被中断时会发生什么情况?,java,multithreading,concurrency,interrupted-exception,Java,Multithreading,Concurrency,Interrupted Exception,考虑到wait()只能在同步上下文中调用,而同步上下文随后会释放监视器,直到另一个线程对同一对象调用notify/nofityAll 假设线程A阻塞了wait(),这导致线程B获得锁。现在,如果我们中断线程A,控制会立即转移到线程A吗?在这种情况下,由于处理InterrupException的try-catch块在同步上下文中,并且一次只有一个线程可以保存监视器,那么线程B会发生什么情况?在线程a完成执行之前,它是否应该移动到阻塞状态 提前感谢我相信A将成为可运行的,但会等到它能够获得锁后再继续

考虑到wait()只能在同步上下文中调用,而同步上下文随后会释放监视器,直到另一个线程对同一对象调用notify/nofityAll

假设线程A阻塞了wait(),这导致线程B获得锁。现在,如果我们中断线程A,控制会立即转移到线程A吗?在这种情况下,由于处理InterrupException的try-catch块在同步上下文中,并且一次只有一个线程可以保存监视器,那么线程B会发生什么情况?在线程a完成执行之前,它是否应该移动到阻塞状态


提前感谢

我相信A将成为可运行的,但会等到它能够获得锁后再继续执行catch子句。它不会强制B进入阻塞状态。同步块的全部要点是,持有锁的线程保证在放弃锁之前,没有其他线程可以在同一个锁上同步;强制B进入阻塞状态并让a重新获得锁将违反同步的本质。

阅读文档实际上有助于:

因此,当线程被中断时,它必须在抛出异常之前重新获取对象的监视器以恢复同步状态。在经过指定的时间后,等待(长)调用返回的情况也一样

然后从该对象的等待集中删除线程T,并 重新启用线程调度。然后它以通常的方式竞争 与其他线程在对象上进行同步的权限;一旦 已获得对对象的控制,其所有同步声明 对象恢复到原来的状态,即 在调用wait方法时的情况。螺纹T 然后从wait方法的调用返回。因此,作为回报 在wait方法中,对象的同步状态和 线程T与调用wait方法时完全相同

如果当前线程在运行时被另一个线程中断 等待,然后抛出InterruptedException。这一例外并非如此 直到此对象的锁定状态恢复为 如上所述


+1.我在文档中搜索wait()(没有参数),但没有提到它(而且没有指向重载wait方法的链接)。太糟糕了,啊!我看不到Java6文档中的解释。无论如何,在这种情况下,我想线程A必须在接收异常时重新检查条件谓词,然后再继续执行任何操作further@arun_suresh:如我所说,它正在等待(长时间)javadoc:。中断通常用于使线程停止。因此,您通常不会继续执行任何操作。@JBNizet:这意味着当线程a在等待状态下被中断时(对于没有参数的等待),它将退出等待状态,并将像以前一样开始争夺锁。当它获得锁时,它将从中断时留下的相同点开始。那么,这是否也意味着在等待中断之前持有锁的另一个线程(线程B)将重新获得锁?