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

Java 如何避免使用Thread.sleep()?,java,multithreading,Java,Multithreading,我有下面的代码片段,用于检查消息是否发送到电话号码: public static boolean checkMessages(long sendTime, String phone) { boolean gotMessage = false; while (!gotMessage) { try { Thread.sleep(5000); } catch (InterruptedException ex) {

我有下面的代码片段,用于检查消息是否发送到电话号码:

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
静态调用将使当前线程至少睡眠给定的时间

取决于系统计时器和调度器的精度和准确性

(见附件)

如果您的
MessageHandler.getResponse
调用在返回之前阻塞,那么您可能根本不需要睡觉

但是,如果此任务“无休止地”重复,您可能希望改用
ScheduledExecutorService
,并根据计划运行它


总之,
Thread.sleep
本身并不是“坏习惯”,但您很少需要实际使用它

不太清楚您的整个代码是做什么的。正如其他人所评论的,了解
MessageHandler
的功能会增加一些上下文

Thread.sleep
静态调用将使当前线程至少睡眠给定的时间

取决于系统计时器和调度器的精度和准确性

(见附件)

如果您的
MessageHandler.getResponse
调用在返回之前阻塞,那么您可能根本不需要睡觉

但是,如果此任务“无休止地”重复,您可能希望改用
ScheduledExecutorService
,并根据计划运行它


总之,
Thread.sleep
本身并不是“坏习惯”,但您很少需要实际使用它

您可以使用番石榴重试库。 它有很好的API


或者您可以从Java库装饰。

您可以使用番石榴重试库。 它有很好的API


或者您可以从Java库进行装饰。

我完全同意Mena的回答,但为了提供Thread.sleep的替代实现,您可以使用倒计时闩锁来执行循环:

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可以处理布尔状态和时间状态

我完全同意Mena的回答,但为了提供Thread.sleep的替代实现,您可以使用倒计时闩锁来执行循环:

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可以处理布尔状态和时间状态

什么是MessageHandler?您使用的是什么通信包?@ccleve MessageHandler是我编写的一个自定义类,用于与我使用的API接口,它不在本问题的范围内。这听起来像是一种情况,您应该使用在消息到达时调用的回调,而不是轮询回调。什么是MessageHandler?您使用的是什么通信包?@ccleve MessageHandler是我编写的一个自定义类,用于与我使用的API接口,它不在本问题的范围内。这听起来像是您应该使用回调函数,在消息到达时调用回调函数,而不是轮询回调函数。