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

时间:2016-07-25 16:23:12

标签: java multithreading

我有以下代码段,旨在检查邮件是否已发送到电话号码:

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不提供回调 - 必须手动调用。

3 个答案:

答案 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 处理你的布尔和时间状态!