簡體   English   中英

while循環中的Thread.sleep()

[英]Thread.sleep() in a while loop

我注意到NetBeans警告我在我的Java代碼中使用while循環中的Thread.sleep(),所以我已經對這個主題進行了一些研究。 主要問題似乎是性能問題,當計數器仍處於休眠狀態時,你的狀態可能會變為真,因此在等待下一次迭代時會浪費掛鍾時間。 這一切都很有道理。

我的應用程序需要聯系遠程系統並定期輪詢操作狀態,等待操作完成后再發送下一個請求。 目前,代碼在邏輯上執行此操作:

String state = get state via RPC call
while (!state.equals("complete")) {
    Thread.sleep(10000); // Wait 10 seconds
    state = {update state via RPC call}
}

鑒於情況是檢查遠程操作(這是一個有點昂貴的過程,因為它運行了幾秒鍾),這是一個在while循環中有效使用Thread.sleep()嗎? 有沒有更好的方法來構建這個邏輯? 我已經看到了一些我可以使用Timer類的例子,但是我沒有看到它的好處,因為它似乎仍然歸結為上面相同的直接邏輯,但是引入了更多的復雜性。

請記住,在這種情況下,遠程系統既不是我的直接控制,也不是用Java編寫的,因此在這種情況下將此端更改為“合作”不是一種選擇。 我更新應用程序狀態值的唯一選擇是創建和發送XML消息,接收響應,解析它,然后提取我需要的信息。

任何建議或意見都是最受歡迎的。

除非您的遠程系統可以發出事件或以其他方式異步通知您,否則我認為上述情況完全不合理。 你需要平衡你的sleep()時間與RPC調用的時間/負載之間的平衡,但我認為這是唯一的問題,而上述內容似乎並不令人擔憂。

無法更改遠程端以提供“推送”通知,即通過其長時間運行的流程完成,這與您將能夠做的一樣。 只要Thread.sleep時間比輪詢成本長,你應該沒問題。

你應該(幾乎)從不使用睡眠,因為它非常低效,而且不是一個好習慣。 始終使用鎖和條件變量,其中線程相互發出信號。 請參閱Mike Dahlin的線程編程編碼標准

模板是:

public class Foo{
  private Lock lock;
  private Condition c1;
  private Condition c2;

  public Foo()
  {
    lock = new SimpleLock();
    c1 = lock.newCondition();
    c2 = lock.newCondition();
    ...
  }

  public void doIt()
  {
    try{
      lock.lock();
      ...
      while(...){
        c1.awaitUninterruptibly();
      }
      ...
      c2.signal();
    }
    finally{
      lock.unlock();
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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