簡體   English   中英

如何避免使用Thread.sleep()?

[英]How would I avoid using 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不提供回調-必須手動調用。

整個代碼的作用還不是很清楚。 正如其他人所評論的那樣,知道MessageHandler功能將添加一些上下文。

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

取決於系統計時器和調度程序的精度和准確性

(請參閱API

如果您的MessageHandler.getResponse調用在返回之前阻塞,那么您可能根本不需要休眠。

但是,如果“無休止地”重復執行此任務,則可能要改用ScheduledExecutorService ,然后根據計划運行它。

底線是, Thread.sleep本身並不是“壞習慣”,但是您實際上不需要使用它。

您可以使用guava重試庫。 重試器它具有不錯的API。

或者,您可以從Java庫裝飾ScheduledThreadPoolExecutor

我完全同意Mena的回答,但是要為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可以同時處理布爾狀態和時間狀態!

暫無
暫無

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

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