2014-10-05 75 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

相關問題