【问题标题】:what happens when a thread is interrupted while blocking on a wait()?当一个线程在等待()上阻塞时被中断会发生什么?
【发布时间】:2011-11-09 20:21:57
【问题描述】:

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

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

提前致谢

【问题讨论】:

    标签: java multithreading concurrency interrupted-exception


    【解决方案1】:

    阅读文档确实有帮助:

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

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

    线程 T 然后从该对象的等待集中移除,并且 重新启用线程调度。然后它以通常的方式竞争 与其他线程获取在对象上同步的权利;一旦它 已经获得了对象的控制权,它的所有同步声明都在 对象恢复到之前的状态——也就是说,恢复到 调用等待方法时的情况。螺纹 T 然后从调用等待方法返回。因此,在返回 从等待方法,对象的同步状态和 线程 T 与调用 wait 方法时完全相同。

    如果当前线程被另一个线程中断,而它正在 等待,然后抛出 InterruptedException。这个例外不 直到该对象的锁定状态恢复为 如上所述。

    【讨论】:

    • +1。我在文档中搜索了 wait() (不带参数),但没有提到(并且没有指向重载的等待方法的链接)。太糟糕了。
    • 啊!我没有在 java 6 doc bit.ly/tNJ1VT 中看到解释。无论如何,在这种情况下,我猜线程 A 必须重新检查接收异常的条件谓词,然后再继续进行
    • @arun_suresh:正如我所说,它正在等待(长时间)javadoc:download.oracle.com/javase/6/docs/api/java/lang/…。中断通常用于使线程停止。所以你通常不会再继续下去了。
    • @JBNizet :这意味着当线程 A 在等待状态(等待没有参数的情况下)被中断时,它将不再等待,并将像以前一样开始竞争锁。获得 lock ,它将从被中断时离开的同一点开始。那么这是否也意味着在等待中断之前持有锁的另一个线程(线程B)将重新获得锁?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 2010-12-21
      • 2015-04-27
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2017-11-11
      • 2012-07-31
      相关资源
      最近更新 更多