我有一个场景:我想等待,直到某些事情是错误的。通常需要20秒左右。
while(foo) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
还是就这样走?
while(foo) {
}
我有一个场景:我想等待,直到某些事情是错误的。通常需要20秒左右。
while(foo) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
还是就这样走?
while(foo) {
}
忙着等待 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
}
这只是一个单元测试,我将使用第一个示例。它不一定很漂亮。
如果这是生产代码,最好使用不同的结构,例如 Condition 或 Future。
第二种形式会消耗大量的 CPU 周期。它会尽可能快地检查,可能每秒十万次。这不是一个好主意。
Thread.sleep()
更好,一点点。foo
如果是一个非易失性字段和/或它不在一个synchronized
块中,那么这里还有另一个问题。实际上并不能保证它会看到来自另一个线程的更新。
java.util.concurrent
像这样使用原语CountDownLatch
。
当然,不能使用第二种形式。这可能会占用 CPU 并导致问题。第一种形式更好。
什么会改变价值?
如果它只是另一个线程,那么您可以考虑使用等待/通知或任何并发构造。
没有人喜欢等待/通知了吗?它比 Sleep() 循环更高效、更简单,并且比 'CountDownLatch' 输入更少。