![](/img/trans.png)
[英]Waiting for something to finsih, should I use thread.sleep or ReentrantLock?
[英]Is Thread.sleep(1000); something reliable to use?
我知道Thread.sleep(1000);
可用於凍結當前線程(在示例中為1秒),但由於您需要拋出Exception
我想知道它是否可以安全使用它。 我不想在程序中使用它並意外地導致問題。
使用Thread.sleep();
是否“正常” Thread.sleep();
或者有更好的方法來實現相同的結果嗎?
順便說一句,如果你想睡覺並且知道你不會使用中斷,那么避免處理InterruptedExceptions的方便方法是使用Guava的Uninterruptibles,例如
Uninterruptibles.sleepUninterruptibly(1000, TimeUnit.MILLISECONDS);
如果以推薦的方式拋出一個(即重置中斷狀態)並避免難看的try-catch塊,這將透明地處理InterruptedException。
因為你需要拋出異常,我想知道它是否安全使用它。
IllegalArgumentException
InterruptedException
,如果線程被中斷 =>如果傳遞正數並且線程沒有被中斷,則不會有異常。
除非你從另一個線程調用theThread.interrupt()
,否則你會沒事的。
編輯
看起來你想要創建一個計時器 - 在這種情況下,你可以通過使用內置機制讓你的生活更簡單:
Runnable r = new Runnable() {
public void run() { runYourTaskHere(); }
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(r, 0, 1, TimeUnit.SECONDS);
取決於你想要做什么,我已經看到Thread.sleep
被使用,它通常用於修復編程錯誤,因為人們認為它解決了競爭條件。 Thread.sleep
必須拋出一個異常,因為Java不控制CPU(最后我檢查過),所以如果CPU有錯誤,或者即使它沒有,並提前喚醒一個線程/以某種方式中斷它的程序(Java)需要一種方法來終止自身並將消息傳播到堆棧中。 此外,這在很大程度上取決於你的意思“相同的結果”
這是非常安全的。 JVM已經提供了InterruptedException,以便您可以在需要時處理它(假設您希望在此線程被中斷時執行額外操作)...它實際上並不意味着發生了一些不好的事情。
由於thread.sleep
暫停當前線程一段時間(不殺死它)。 所以使用它是安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.