【问题标题】:Is Thread.sleep better than continually checking to see if a condition is met?Thread.sleep 比不断检查是否满足条件更好吗?
【发布时间】:2016-07-03 00:40:23
【问题描述】:

我希望这个程序无限期地运行,但我不确定最大化 CPU 和内存效率的最佳方法。我创建了一个处理来自服务器的响应的线程,这些响应将每 20 秒左右返回一次。但是,我必须确保服务器仍在发送响应,否则我必须从新服务器获取响应。每次返回响应时,当前系统时间都存储在“lastRTime”中。这里有更好的 Thread.sleep() 替代方案吗?这是我的主线程的结尾。

while(true) {
    Thread.sleep(checkInterval);
        if (System.currentTimeMillis()-lastRTime > timeDiffThreshold) {
            pmsi.beginClose();    //Close the current connection
            makeConnection(backupHost,backupPort);
        }
    }
}

不睡觉会更好吗?

【问题讨论】:

  • 并且lastRTime 在收到响应的地方更新?
  • 最好使用ScheduledExecutor 之类的东西定期执行操作。但是,是的,睡眠意味着您不会最大限度地利用 CPU 做很少有用的工作。
  • 不需要循环。您可以通过计算准确地告诉您多长时间要睡多久for,除非您必须担心时钟重置和 DST。

标签: java multithreading platform-sdk


【解决方案1】:

我认为最好的选择(但不是必须的)是使用ScheduledExecutor 并提交您的检查以在checkInterval 之后运行。如果您能更早地得到回复,您可以取消该任务并重新提交,但有新的延迟。

所以我会这样(伪代码):

  1. 安排响应检查在checkInterval之后运行
  2. 处理响应
  3. 如果“检查”任务仍处于挂起状态,请取消它,更新 lastRTime,然后重新安排(第 1 点)

如果检查任务会触发,则重新安排。

这样你可以省略 lastRTime 和 Thread.sleep() 调用时间戳之间的等待时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 2021-04-25
    • 2018-04-11
    • 2019-03-16
    • 2021-09-06
    相关资源
    最近更新 更多