等到布尔值更改其状态
2022-08-31 17:24:43
我有一个线程等待布尔值像这样变化:
while(!value)
{
Thread.sleep(1000)
}
// Do some work after change of the value
这不是我更喜欢这样做的方式,导致大量的CPU消耗。
有没有办法阻止线程,直到布尔值改变它的状态?
我有一个线程等待布尔值像这样变化:
while(!value)
{
Thread.sleep(1000)
}
// Do some work after change of the value
这不是我更喜欢这样做的方式,导致大量的CPU消耗。
有没有办法阻止线程,直到布尔值改变它的状态?
这不是我更喜欢这样做的方式,导致大量的CPU消耗。
如果这实际上是您的工作代码,那么请保持原样。每秒检查一次布尔值会导致没有可测量的 CPU 负载。没有。
真正的问题是,检查该值的线程可能无法看到由于缓存而任意长时间发生的更改。为了确保值始终在线程之间同步,您需要将 volatile 关键字放在变量定义中,即
private volatile boolean value;
请注意,将访问权限放在块中(例如,在使用其他答案中描述的基于通知的解决方案时)将具有相同的效果。synchronized
您需要一种避免忙于等待的机制。旧机制充满了陷阱,所以更喜欢库中的东西,例如CountDownLatch
:wait/notify
java.util.concurrent
public final CountDownLatch latch = new CountDownLatch(1);
public void run () {
latch.await();
...
}
在另一边打电话
yourRunnableObj.latch.countDown();
但是,启动线程而不执行任何操作,但等到需要它仍然是最好的方法。您还可以使用一个,您将提交的工作作为任务,在满足条件时必须完成。ExecutorService