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

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

最佳答案

您的整个代码的作用不是很清楚。正如其他人评论的那样,了解 MessageHandler 的作用会增加一些上下文。

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

subject to the precision and accuracy of system timers and schedulers

(参见 API)

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

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

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

关于java - 我如何避免使用 Thread.sleep()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38572918/

相关文章:

java - IntelliJ IDEA GUI 构建器——不生成 Java 代码

java - 如何在不持有线程的情况下通知所有观察者?

java - 对 LinkedBlockingQueue 的 take 方法的说明

multithreading - 代替hash_map使用的数据结构

C 程序卡住,不进入 main()

java - 无法使用 Selenium 在 ionic 输入中找到文本区域元素

java - Firebase 数据库从最后一个子级开始循环遍历子级

java - 关闭 ExecutorService

java - 使用 Flying Saucer 和 CSS 进行分段页数统计

java - 亚马逊 MWS 入门