Thread.sleep() in a while loop

2022-09-01 19:23:52

我注意到 NetBeans 警告我不要在我的 Java 代码中循环中使用 Thread.sleep(),所以我对这个主题做了一些研究。似乎主要问题是性能问题,当计数器仍在睡眠时,您的 while 条件可能会变为真,从而在等待下一次迭代时浪费了时钟时间。这一切都非常有意义。

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

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 消息,接收响应,分析它,然后提取我需要的信息。

任何建议或意见将是非常欢迎的。


答案 1

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


答案 2

如果无法更改远程端以提供“推送”通知,表明它已完成其长时间运行的进程,那么这与您将能够做到的差不多。只要与轮询成本相比,Thread.sleep时间很长,您就应该没问题。