【发布时间】:2017-07-08 10:04:20
【问题描述】:
我有一个无限期运行的工作线程,如果无事可做,它会休眠一分钟。有时,另一段代码产生了一些工作并想立即唤醒工作线程。
所以我做了这样的事情(代码仅供说明):
class Worker {
public void run() {
while (!shuttingDown()) {
step();
}
}
private synchronized void step() {
if (hasWork()) {
doIt();
} else {
wait(60_000);
}
}
public synchronized wakeMeUpInside() {
notify();
}
}
我不喜欢只是为了唤醒某些东西而必须进入监视器,这意味着通知线程可能会无缘无故地延迟。由于本地同步的选择有限,我想我会切换到Condition,但它有exactly the same problem:
当调用此方法时,实现可能(并且通常确实)要求当前线程持有与此条件关联的锁。
【问题讨论】:
-
我想,我在做一些愚蠢的事情......实际上,只有
wait和notify需要包含在同步块中。那里还有另一个不相关的同步,我把它混为一谈...... -
我推荐
BlockingQueue。这样你就可以忘记synchronized和wait/notify。您只需要在关闭时中断正在等待queue.poll()的线程即可。 -
@Kayaman 我知道
BlockingQueue,但我没有将工作发送到线程,我只是通知它。此外,所有工作(由多个线程产生)可能会或可能不会在一个步骤中执行。
标签: java multithreading thread-sleep