2014-10-05 74 views
3

考虑以下两个块:我们是否应该在执行超时时使用Thread.sleep()?

// 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()方法,它似乎能降低条件在whileif检查。然而,假设if条件不具有繁重的计算,是否有任何有意义的好处?你会推荐哪一个实现超时?

+1

都没有。这两个相当脏的黑客,应尽可能避免。话虽如此,第一个让CPU有机会做其他事情 - 第二个选项绝对没有理由吃掉整个核心。 – 2014-10-05 15:44:14

+0

虽然第二次操作至少需要100 ms,如果条件仅在第一次检查1μs后才变为真,则该操作可能会相当长。 – 5gon12eder 2014-10-05 16:00:26

回答

2

一个关键的区别是第二种方法涉及busy waiting。如果SOME_CONDITION_IS_MET不涉及任何I/O,则第二种方法可能会占用整个CPU内核。这是一件浪费的事情(但在一些非常罕见的情况下可能是完全合理的)。另一方面,第二种方法具有较低的延迟。

我同意鲍里斯的看法,在一般情况下,两种方法基本上都是黑客。更好的方法是使用正确的synchronization primitives来表示情况。

+0

_ @ NPE:谢谢你的回答。我试用了条件界面。但是,不知何故,我不能让signalAll()工作。我在这里发布我的问题:http://stackoverflow.com/questions/26205627/condition-instance-signalall-doesnt-return – JBT 2014-10-05 18:06:01

相关问题