逼格高的抽屉 · TVM:编译深度学习模型快速上手教程_tvm ...· 6 月前 · |
刚毅的莴苣 · 十八大以来纪检机关加强自身建设:铁拳清理门户 ...· 1 年前 · |
销魂的跑步鞋 · 在Vue中,如何通过代码触发元素失去焦点的事 ...· 1 年前 · |
我注意到NetBeans警告我不要在Java代码中的while循环中使用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编写的,因此在这种情况下,将其更改为更“协作”是不可取的。更新应用程序的state值的惟一选择是创建并发送一条XML消息,接收响应,解析它,然后提取所需的信息。
任何建议或意见都是非常受欢迎的。
发布于 2012-01-10 01:50:25
除非您的远程系统可以发出事件或以其他方式异步通知您,否则我不认为上述情况是完全不合理的。您需要在
sleep()
时间和RPC调用产生的时间/负载之间取得平衡,但我认为这是唯一的问题,上面的问题看起来一点也不重要。
发布于 2012-01-10 01:50:52
如果不能更改远程端以提供“推送”通知,表明它已完成其长期运行的进程,那么这将是您所能做的最好的。只要Thread.sleep时间与轮询成本相比较长,您就应该没问题。
发布于 2012-01-10 04:59:36
你应该(几乎)永远不要使用睡眠,因为它的效率非常低,而且不是一个好的做法。总是使用锁和条件变量,线程之间相互发信号。请参阅Mike Dahlin的 Coding Standards for Programming with threads
模板为:
public class Foo{
private Lock lock;
private Condition c1;
private Condition c2;
public Foo()
lock = new SimpleLock();
c1 = lock.newCondition();
c2 = lock.newCondition();
public void doIt()
lock.lock();
while(...){
c1.awaitUninterruptibly();
c2.signal();