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