0

我很好奇是否可以通过运行以下暂停代码来暂停tJava 中的线程并允许另一个线程稍后恢复它:t

while(true) {
  try {
    synchronized(t) { 
      t.wait();
    }
  } catch(InterruptedException e) {
    break;
  }
}

t然后通过调用它来恢复线程.interrupt()。但是,我读过关于虚假唤醒的文章,所以我想知道我的代码是否会失败,即退出 while 循环,尽管没有其他线程调用.interrupt()它。虽然这个答案这个答案表明没有虚假中断,因此我的代码永远不会失败,但 Java 文档似乎没有解决这个问题。我的问题可能归结为是否InterruptedException在线程不被.interrupt(). 是否有任何官方资料或文件可以证实这一点?

4

1 回答 1

1

概括

因此,尽管从技术上讲这是可行的,但不应该这样做的原因有很多。Oracle 的文档指出,中断只能用于取消。但是如果你这样做,它会清除中断状态并且之前等待的线程会收到一个InterruptedException.


选择

让我们通过一个简短的简化示例。

Object obj = new Object;
synchronized (obj) {
    while(condition) {
        obj.wait();
    }
} 
  1. Athread在这里将获得监视器。

  2. thread开始通过 等待wait(),然后释放监视器。始终wait()在条件内使用,因为线程可能会从wait(). 至此,您已经实现了强制线程等待。

让我们研究一下如何让线程恢复工作。

synchronized(obj) {
    obj.notify();
}

notify()唤醒thread监视器上的第一个等待。现在,如果您希望唤醒所有等待的线程,请notifyAll()改用。这是wait()/的预期目的和功能,notify()因此应该在wait()/上使用interrupt()。有关其他示例,请参阅本文

于 2018-08-20T18:48:05.653 回答