gpt4 book ai didi

java - sleep 并检查直到条件为真

转载 作者:IT老高 更新时间:2023-10-28 20:40:18 32 4
gpt4 key购买 nike

Java 中是否有执行以下操作的库? thread 应该重复 sleep x 毫秒,直到条件变为真或达到最大时间。

这种情况主要发生在测试等待某个条件变为真时。该条件受另一个线程的影响。

[编辑]为了更清楚,我希望测试在失败之前只等待 X 毫秒。它不能永远等待条件变为真。我正在添加一个人为的示例。

class StateHolder{
boolean active = false;
StateHolder(){
new Thread(new Runnable(){
public void run(){
active = true;
}
}, "State-Changer").start()
}
boolean isActive(){
return active;
}
}


class StateHolderTest{
@Test
public void shouldTurnActive(){
StateHolder holder = new StateHolder();
assertTrue(holder.isActive); // i want this call not to fail
}
}

最佳答案

编辑

大多数答案都集中在带有等待和通知或条件的低级 API(它们的工作方式或多或少相同):当您不习惯它时,很难做到正确。证明:这些答案中有 2 个没有正确使用等待。
java.util.concurrent为您提供一个高级 API,所有这些复杂性都被隐藏了。

恕我直言,当并发包中存在实现相同功能的内置类时,使用等待/通知模式毫无意义。


一个 CountDownLatch初始计数为 1 正是这样做的:

  • 当条件成立时,调用latch.countdown();
  • 在您的等待线程中,使用:boolean ok = latch.await(1, TimeUnit.SECONDS);

人为的例子:

final CountDownLatch done = new CountDownLatch(1);

new Thread(new Runnable() {

@Override
public void run() {
longProcessing();
done.countDown();
}
}).start();

//in your waiting thread:
boolean processingCompleteWithin1Second = done.await(1, TimeUnit.SECONDS);

注意:CountDownLatches 是线程安全的。

关于java - sleep 并检查直到条件为真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14464544/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com