0

我有一个场景:我想等待,直到某些事情是错误的。通常需要20秒左右。

while(foo) {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

还是就这样走?

while(foo) {

}
4

5 回答 5

9

忙着等待 20 秒不是一个好主意——睡 5 秒意味着您可能会错过 5 秒的信号。您不能使用其他方式,例如CountdownLatch

CountDownLatch latch = new CountDownLatch(1);

//code that triggers the signal
latch.countDown();

//code that waits for the signal
try {
    latch.await();
} catch (InterruptedException e) {
    //handle interruption
}
于 2012-09-25T11:59:03.657 回答
2

这只是一个单元测试,我将使用第一个示例。它不一定很漂亮。

如果这是生产代码,最好使用不同的结构,例如 Condition 或 Future。

于 2012-09-25T11:58:43.533 回答
1

第二种形式会消耗大量的 CPU 周期。它会尽可能快地检查,可能每秒十万次。这不是一个好主意。

Thread.sleep()更好,一点点。foo如果是一个非易失性字段和/或它不在一个synchronized块中,那么这里还有另一个问题。实际上并不能保证它会看到来自另一个线程的更新。

java.util.concurrent像这样使用原语CountDownLatch

于 2012-09-25T11:59:42.597 回答
0

当然,不能使用第二种形式。这可能会占用 CPU 并导致问题。第一种形式更好。

什么会改变价值?

如果它只是另一个线程,那么您可以考虑使用等待/通知或任何并发构造。

于 2012-09-25T12:08:05.363 回答
0

没有人喜欢等待/通知了吗?它比 Sleep() 循环更高效、更简单,并且比 'CountDownLatch' 输入更少。

于 2012-09-25T12:09:44.200 回答