2010-03-29 96 views
1

考慮下面的代碼:如何在java中暫停一個線程?

而(真){ someFunction(); Thread.sleep(1000); }

我想那是什麼,someFunction()被調用一次每10秒。但這種情況並非如此。它每秒鐘都被調用。我嘗試了Thread.wait(1000),但即使這樣也沒有幫助。我刪除了部分,只是保持身體,並在最後寫道:

Thread.start();

但它拋出了一個異常。還有其他解決方案嗎?

+6

你認爲幾秒鐘之後會有多少毫秒? (提示:它不是100) – 2010-03-29 12:16:11

+0

大聲笑。我的錯。沒有意識到我把1000而不是10000! :) – mithun1538 2010-03-29 12:22:02

回答

14

它每秒都會被調用,因爲你正在睡1000毫秒,也就是1秒。

將其更改爲Thread.sleep(10000)這對您會更好。

另外,使用

Thread.sleep(TimeUnit.SECONDS.toMillis(10)); 

,這意味着你不必自己做算術。 (很多API現在需要一個數量和一個TimeUnit,但不幸的是Thread.sleep似乎沒有類似的東西。)

請注意,這將使線程在10秒內無響應,沒有乾淨的方式告訴它醒來(例如因爲你想關閉它)。我通常更喜歡使用wait(),這樣我就可以從不同的線程監聽同一個顯示器,以表明「我希望你現在醒來!」這通常是從以下形式的while循環中

while (!shouldStop()) 

編輯:使用Timer的tvanfosson的溶液也不錯 - 和另一個替代方案是使用ScheduledExecutorService其可以是多一點柔性的(和更容易測試) 。

+0

@Jon,我們確定mithun1538完全使用ThreadPool嗎? – 2010-03-29 12:24:21

+0

ThreadPool?我沒有聽說過這個詞。我正在開發一個簡單的應用程序,所以我猜測我沒有使用「ThreadPool」。 – mithun1538 2010-03-29 12:27:29

+0

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html#sleep(long \),雖然可能不是非常SoC。此外,該線程可能會被中斷喚醒。 – 2012-02-17 19:49:05

3

Thread.sleep()需要數毫秒睡眠。因此,呼叫Thread.sleep(1000)睡1000毫秒,這是1秒。做那Thread.sleep(10000)它會睡10秒。

1

你可能想要做的就是使用Timer並設置一個預定的函數調用而不是睡眠。如果您需要更準確的時間間隔,您可以跟蹤自上次運行以來的時間,並調整新的計時器以防止間隔漂移。在這個tutorial看到一個簡單的計時器的例子。

我不會詳細討論關於參數精度的問題,因爲@Jon已經說明了這一點 - 您需要毫秒而不是秒。

-2

我想要的是,someFunction()是 每10秒調用一次。

那你爲什麼叫Thread.sleep()與1000作爲參數?這是毫秒,所以你明確地說「等待1秒」。

1

1秒爲1000毫秒,所以如果要10秒= 10 * 1000 = 10000毫秒

例如

try { 
    long numMillisecondsToSleep = 5000; // 5 seconds 
    Thread.sleep(numMillisecondsToSleep); 
} catch (InterruptedException e) { } 
0

考慮1000毫秒是1秒。爲此,你應該使用Thread.sleep(10000)來實現在10秒內暫停你的線程。您也可以使用循環多少秒來等待您的線程。例如,假設你想在半小時(30分鐘)內暫停你的線程。然後使用,

for(i=0;i<1800;i++) 
{ 
    Thread.sleep(1000); 
} 

它會在30分鐘內暫停您的線程。