Thread.sleep()在while循环中?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (17)

我注意到NetBeans警告我在Java代码的while循环中使用Thread.sleep(),所以我对这个主题做了一些研究。看起来问题主要是表现问题,在计数器仍然处于睡眠状态时,您的条件可能会变为真,因此在等待下一次迭代时会浪费时间。这一切都非常有意义。

我的应用程序需要联系远程系统并定期轮询操作状态,等待操作完成后再发送下一个请求。目前代码在逻辑上是这样做的:

String state = get state via RPC call
while (!state.equals("complete")) {
    Thread.sleep(10000); // Wait 10 seconds
    state = {update state via RPC call}
}

鉴于情况正在检查远程操作(这是一个相当昂贵的过程,因为它运行了几秒钟),这是在while循环中Thread.sleep()的有效使用吗?有没有更好的方法来构造这种逻辑?我已经看到了一些可以使用Timer类的例子,但是我没有看到它的好处,因为它似乎仍然归结为上面的简单逻辑,但是引入了更多的复杂性。

请记住,在这种情况下,远程系统既不在我的直接控制之下,也不在Java中编写,因此在这种情况下将此端改为更“合作”不是一种选择。我更新我的应用程序状态值的唯一选择是创建和发送XML消息,接收响应,解析它,然后提取我需要的信息。

提问于
用户回答回答于

除非你的远程系统可以发出事件或以其他方式异步通知您,否则我认为上述内容完全不合理。你需要平衡sleep()时间与RPC调用的时间/负载之间的平衡,但我认为这是唯一的问题,而且上述内容似乎并不重要。

用户回答回答于

如果不能改变远端来提供一个“推送”通知,说明它已经完成了其长时间运行的过程,那么这与你将能够做到的事情差不多。只要Thread.sleep时间与轮询成本相比较长,你应该可以。

扫码关注云+社区