【发布时间】:2018-08-20 15:37:29
【问题描述】:
我很好奇是否可以通过让t 运行以下暂停代码来暂停 Java 中的线程 t 并允许另一个线程稍后恢复它:
while(true) {
try {
synchronized(t) {
t.wait();
}
} catch(InterruptedException e) {
break;
}
}
然后通过调用.interrupt() 来恢复线程t。但是,我读过关于虚假唤醒的文章,所以我想知道我的代码是否会失败,即退出 while 循环,尽管没有其他线程调用 .interrupt()。虽然this answer 和this answer 声明没有虚假中断,因此我的代码永远不会失败,the Java docs 似乎没有解决这个问题。我的问题可能归结为InterruptedException 是否在没有被.interrupt() 中断的线程的情况下被抛出。是否有任何官方资料或文件可以证实这一点?
【问题讨论】:
-
不管是否存在虚假中断,我认为
interrupt()在这种情况下不是一个好主意,应该使用易失性布尔字段来代替。 -
至少可以说,中断线程并不是恢复线程的最佳方式。
-
为什么要在线程对象上使用
synchronized?您同步多个线程使用的对象,而不是线程本身。使用wait和notify暂停和恢复。 -
此外,除非这是出于学习目的,否则您可能只从
java.util.concurrent中选择一个完全满足您需要的课程,在您的情况下可能是CountdownLatch或CyclicBarrier。 -
@biziclop:我想确切地知道它是如何工作或不工作的,所以你可以说这是为了我的学习目的。
标签: java multithreading synchronized interrupted-exception spurious-wakeup