我有以下代码段,旨在检查邮件是否已发送到电话号码:
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 :(得分:5)
您的整个代码的作用并不十分清楚。正如其他人评论的那样,知道MessageHandler
会做什么会增加一些背景。
Thread.sleep
静态调用将使当前线程至少在给定的时间内休眠,
受系统计时器和调度程序的精确性和准确性的影响
(见API)
如果您的MessageHandler.getResponse
调用在返回之前阻塞,那么您可能根本不需要休眠。
但是,如果“无休止地”重复执行此任务,您可能希望改为使用ScheduledExecutorService
,并根据计划运行它。
底线,Thread.sleep
本身不是“坏习惯”,但你很少需要实际使用它。
答案 1 :(得分:0)
您可以使用番石榴重试库。 Retryer 它有很好的API。
或者您可以从Java库中装饰ScheduledThreadPoolExecutor。
答案 2 :(得分:0)
我完全同意Mena的回复,但为Thread.sleep提供替代实现,您可以使用CountdownLatch来执行循环:
<div id="header">header</div>
<div id="content">
a<br>b<br>c<br>d<br>e<br>f<br>g<br>h<br>i<br>i<br>j<br>k<br>l<br>m<br>n<br>o<br>p<br>q<br>r<br>s<br>t<br>u<br>v<br>q<br>x<br>y<br>z<br>
a<br>b<br>c<br>d<br>e<br>f<br>g<br>h<br>i<br>i<br>j<br>k<br>l<br>m<br>n<br>o<br>p<br>q<br>r<br>s<br>t<br>u<br>v<br>q<br>x<br>y<br>z<br>
a<br>b<br>c<br>d<br>e<br>f<br>g<br>h<br>i<br>i<br>j<br>k<br>l<br>m<br>n<br>o<br>p<br>q<br>r<br>s<br>t<br>u<br>v<br>q<br>x<br>y<br>z<br>
</div>
<div id="footer">footer</div>
使用 CountDownLatch.await 处理你的布尔和时间状态!