睡觉并检查,直到情况成立

Rag*_*Rag 22 java multithreading sleep

Java中是否有一个库可以执行以下操作?A thread应重复sleepx毫秒,直到条件变为真或达到最大时间.

当测试等待某些条件变为真时,这种情况通常发生.这种情况受到另一个人的影响thread.

[编辑]为了使它更清楚,我希望测试在失败前只等待X ms.它不能永远等待条件成为现实.我正在添加一个人为的例子.

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 
    }
}
Run Code Online (Sandbox Code Playgroud)

ass*_*ias 20

编辑

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

恕我直言,当并发包中有一个实现相同的内置类时,没有必要使用wait/notify模式.


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);
Run Code Online (Sandbox Code Playgroud)

注意:CountDownLatches是线程安全的.


thi*_*ign 10

Awaitility提供简单而干净的解决方案:

await().atMost(10,SECONDS).until(() - > condition());


Ale*_*rlo 8

你应该使用一个Condition.

如果您希望除条件外还有超时,请参阅 await(long time, TimeUnit unit)


小智 0

你不应该一边睡觉一边检查,一边睡觉一边检查。您想要等待条件变量并让条件发生变化,并在需要执行某些操作时唤醒线程。