2016-07-25 132 views
0

我的代碼下面的代碼片段,旨在檢查,如果消息被髮送到一個電話號碼:我將如何避免使用Thread.sleep()?

public static boolean checkMessages(long sendTime, String phone) { 
    boolean gotMessage = false; 

    while (!gotMessage) { 
     try { 
      Thread.sleep(5000); 
     } catch (InterruptedException ex) { 
      Thread.currentThread().interrupt(); 
     } 
     gotMessage = MessageHandler.getResponse(sendTime, phone); 
    } 
    return gotMessage; 
} 

這個代碼本身是通過CompletableFuture調用,因此它可以與其它檢查並行運行。如果在一定時間內沒有滿足兩項支票,則兩項都將到期。

現在,根據我的IDE和本網站,使用Thread.sleep()由於多種原因而不好,所以我想以某種方式從我的代碼中刪除它。

有沒有辦法做到這一點,使這種方法將永遠返回true,就像它目前是?


MessageHandler.getResponse()是處理我寫檢查,如果我收到了包含文本的特定(硬編碼)字符串從一個特定的電話號碼的短信。它會阻止執行,直到完成檢查,但我使用的API具有非常積極的速率限制。 API不提供回調 - 必須手動調用。

+0

什麼是MessageHandler?你使用什麼通訊軟件包? – ccleve

+0

@ccleve MessageHandler是我編寫的與我使用的API接口的自定義類,它不在此問題的範圍之內。 –

+0

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ScheduledExecutorService.html#scheduleAtFixedRate-java.lang.Runnable-long-long-java.util.concurrent。TimeUnit- – assylias

回答

4

這並不是很清楚你的整個代碼是幹什麼的。正如其他人所評論的那樣,知道MessageHandler會添加一些上下文。

Thread.sleep靜態調用將使當前線程睡眠至少給定的時間量,

受精度和系統計時器和調度程序

的精度(見API

如果您的MessageHandler.getResponse調用在返回之前阻止,那麼您可能根本不需要睡覺。

但是,如果此任務重複「無休止地」,您可能需要使用ScheduledExecutorService代替,並根據計劃運行該任務。

底線,Thread.sleep本身並不是「壞習慣」,但您很少需要實際使用它。

0

我梅納的反應完全認同,但要提供一個備用實施了Thread.sleep,你可以使用的CountDownLatch來執行你的循環:

public void blockingWaitForMessage(long sendTime, String phone) throws InterruptedException{ 
     final CountDownLatch latch = new CountDownLatch(1); 
     while (!latch.await(5, TimeUnit.SECONDS)) { 
      if (MessageHandler.getResponse(sendTime, phone)) { 
       latch.countDown(); 
      } 
     } 
    } 

使用CountDownLatch.await同時處理您的布爾和時態!