等到布尔值更改其状态

2022-08-31 17:24:43

我有一个线程等待布尔值像这样变化:

while(!value)
{
  Thread.sleep(1000)
}
// Do some work after change of the value

这不是我更喜欢这样做的方式,导致大量的CPU消耗。

有没有办法阻止线程,直到布尔值改变它的状态?


答案 1

这不是我更喜欢这样做的方式,导致大量的CPU消耗。

如果这实际上是您的工作代码,那么请保持原样。每秒检查一次布尔值会导致没有可测量的 CPU 负载。没有。

真正的问题是,检查该值的线程可能无法看到由于缓存而任意长时间发生的更改。为了确保值始终在线程之间同步,您需要将 volatile 关键字放在变量定义中,即

private volatile boolean value;

请注意,将访问权限放在块中(例如,在使用其他答案中描述的基于通知的解决方案时)将具有相同的效果。synchronized


答案 2

您需要一种避免忙于等待的机制。旧机制充满了陷阱,所以更喜欢库中的东西,例如CountDownLatchwait/notifyjava.util.concurrent

public final CountDownLatch latch = new CountDownLatch(1);

public void run () {
  latch.await();
  ...
}

在另一边打电话

yourRunnableObj.latch.countDown();

但是,启动线程而不执行任何操作,但等到需要它仍然是最好的方法。您还可以使用一个,您将提交的工作作为任务,在满足条件时必须完成。ExecutorService