考虑以下两个块:
// block one
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < TIMEOUT) {
if( SOME_CONDITION_IS_MET ) {
// do something
break;
} else {
Thread.sleep( 100 );
}
}
// block two
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < TIMEOUT) {
if( SOME_CONDITION_IS_MET ) {
// do something
break;
}
}
两者之间的区别在于第一个有一个Thread.sleep(),它似乎可以减少while
和if
中的条件检查。但是,假设if
条件没有大量计算,那么通过这种睡眠是否有任何有意义的好处?你会推荐哪一个实现超时?
答案 0 :(得分:2)
一个关键区别是第二种方法涉及busy waiting。如果SOME_CONDITION_IS_MET
不涉及任何I / O,则第二种方法可能会消耗整个CPU核心。这是一件很浪费的事情(但在某些情况下可能完全合理 - 非常罕见)。另一方面,第二种方法具有较低的延迟。
我同意鲍里斯的观点,在一般情况下,这两种方法基本上都是黑客攻击。更好的方法是使用适当的synchronization primitives来表示情况。