簡體   English   中英

Java中的“ Do While循環”與Thread.sleep的另一種方式?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM