[英]Another way of Thread.sleep with Do While Loops in Java?
每當我寫Thread.sleep(500);
在我的代碼中,它總是告訴我使用Thread.sleep();
有時會導致問題Thread.sleep();
。 還有另一種方法可以延遲某些事情之前的時間。 如果是這樣,您能給我代碼和解釋。 謝謝
首先,您不向我們顯示任何代碼,也沒有提及“它”是什么。 (如“它總是告訴我...”。)這使得不可能給出具體的答案。
最有可能提到的問題是sleep
會使您的代碼浪費或無響應。 使線程等待某種條件的常見“ hack”是反復調用sleep,然后測試條件。 問題是,如果在您睡眠時條件變為真,則線程將一直保持睡眠狀態,直到睡眠間隔到期為止。 如果您使睡眠間隔更短,那么您將通過喚醒/測試/睡眠迭代“消耗”更多的CPU周期。
如果您嘗試實現“等待某些條件變為真”,那么執行此操作的有效方法是使用wait()
和notify()
(或notifyAll()
),或者使用適當的更高級別的同步類。
經典的Java模式是這樣的:
// waiting for the condition
synchronized (obj) {
while (!condition) {
obj.wait();
}
}
...
// updating the condition ...
synchronized (obj) {
// do something that makes condition true
obj.wait();
}
請注意,如果使用等待/通知,則必須使用synchronized
。
Condition
接口可用於讓其他線程通知您有關特定事件的信息,並要求當前線程在此之前“停放”。 Condition
接口還具有一個名為waitUntil(Date deadline)
-導致當前線程等待,直到截止時間過去。
您是否在等待其他線程執行一些活動並等到那時? 使用任何阻塞數據結構(例如BlockingQueue
或其他高級同步器(例如CountdownLatch
。
如果只是等待某個線程完成其執行,請使用join()
。
正如提到的Bay MadProgrammer和alfasin一樣,了解您要實現的目標以及所談論的sleep()
的問題很重要。
如果您希望在不久的將來發生某些事情,那么反復使用睡眠是一件壞事。 一次它不能保證“按時”運行,而第二次它可以隨時被中斷,從而導致程序出現故障。
如果您的代碼中有一部分需要重復執行,那么使用Timer可以很好地解決這一問題。 如果有多個不同部分的代碼需要在給定的延遲下執行,則應使用ScheduledExecutorService 。 您可以直接使用ScheduledThreadPoolExecutor,也可以(更方便地)使用ExecutorService。
您只需使用一個線程就可以輕松避免線程問題。 但是,如果使用正確的工具,則在Java中進行線程並不是那么困難。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.