当一个线程在wait()上阻塞时被中断时会发生什么?

时间:2011-11-09 20:21:58

标签: java multithreading concurrency interrupted-exception

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

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

先谢谢

2 个答案:

答案 0 :(得分:8)

阅读文档确实有帮助:

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#wait%28long%29

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

  

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

     

如果当前线程被另一个线程中断   等待,然后抛出InterruptedException。这个例外不是   抛出此对象的锁定状态已恢复为   如上所述。

答案 1 :(得分:2)

我相信A会变为可运行但会等到它可以获得锁之前再继续使用catch子句。它不会强制B进入阻塞状态。同步块的重点是保证锁定的线程保证没有其他线程可以在同一个锁上同步,直到它放弃锁定为止;强制B进入阻塞状态并让A重新获取锁定将违反同步的本质。