考慮下面的代碼:如何在java中暫停一個線程?
而(真){ someFunction(); Thread.sleep(1000); }
我想那是什麼,someFunction()被調用一次每10秒。但這種情況並非如此。它每秒鐘都被調用。我嘗試了Thread.wait(1000),但即使這樣也沒有幫助。我刪除了部分,只是保持身體,並在最後寫道:
Thread.start();
但它拋出了一個異常。還有其他解決方案嗎?
考慮下面的代碼:如何在java中暫停一個線程?
而(真){ someFunction(); Thread.sleep(1000); }
我想那是什麼,someFunction()被調用一次每10秒。但這種情況並非如此。它每秒鐘都被調用。我嘗試了Thread.wait(1000),但即使這樣也沒有幫助。我刪除了部分,只是保持身體,並在最後寫道:
Thread.start();
但它拋出了一個異常。還有其他解決方案嗎?
它每秒都會被調用,因爲你正在睡1000毫秒,也就是1秒。
將其更改爲Thread.sleep(10000)
這對您會更好。
另外,使用
Thread.sleep(TimeUnit.SECONDS.toMillis(10));
,這意味着你不必自己做算術。 (很多API現在需要一個數量和一個TimeUnit
,但不幸的是Thread.sleep
似乎沒有類似的東西。)
請注意,這將使線程在10秒內無響應,沒有乾淨的方式告訴它醒來(例如因爲你想關閉它)。我通常更喜歡使用wait()
,這樣我就可以從不同的線程監聽同一個顯示器,以表明「我希望你現在醒來!」這通常是從以下形式的while循環中
while (!shouldStop())
編輯:使用Timer
的tvanfosson的溶液也不錯 - 和另一個替代方案是使用ScheduledExecutorService
其可以是多一點柔性的(和更容易測試) 。
@Jon,我們確定mithun1538完全使用ThreadPool嗎? – 2010-03-29 12:24:21
ThreadPool?我沒有聽說過這個詞。我正在開發一個簡單的應用程序,所以我猜測我沒有使用「ThreadPool」。 – mithun1538 2010-03-29 12:27:29
http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/TimeUnit.html#sleep(long \),雖然可能不是非常SoC。此外,該線程可能會被中斷喚醒。 – 2012-02-17 19:49:05
Thread.sleep()
需要數毫秒睡眠。因此,呼叫Thread.sleep(1000)
睡1000毫秒,這是1秒。做那Thread.sleep(10000)
它會睡10秒。
你可能想要做的就是使用Timer
並設置一個預定的函數調用而不是睡眠。如果您需要更準確的時間間隔,您可以跟蹤自上次運行以來的時間,並調整新的計時器以防止間隔漂移。在這個tutorial看到一個簡單的計時器的例子。
我不會詳細討論關於參數精度的問題,因爲@Jon已經說明了這一點 - 您需要毫秒而不是秒。
我想要的是,someFunction()是 每10秒調用一次。
那你爲什麼叫Thread.sleep()
與1000作爲參數?這是毫秒,所以你明確地說「等待1秒」。
1秒爲1000毫秒,所以如果要10秒= 10 * 1000 = 10000毫秒
例如
try {
long numMillisecondsToSleep = 5000; // 5 seconds
Thread.sleep(numMillisecondsToSleep);
} catch (InterruptedException e) { }
考慮1000毫秒是1秒。爲此,你應該使用Thread.sleep(10000)來實現在10秒內暫停你的線程。您也可以使用循環多少秒來等待您的線程。例如,假設你想在半小時(30分鐘)內暫停你的線程。然後使用,
for(i=0;i<1800;i++)
{
Thread.sleep(1000);
}
它會在30分鐘內暫停您的線程。
你認爲幾秒鐘之後會有多少毫秒? (提示:它不是100) – 2010-03-29 12:16:11
大聲笑。我的錯。沒有意識到我把1000而不是10000! :) – mithun1538 2010-03-29 12:22:02