首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >while循环中的Thread.sleep()

while循环中的Thread.sleep()
EN

Stack Overflow用户
提问于 2012-01-10 01:46:54
回答 3查看 34K关注 0票数 24

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

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

代码语言:javascript
复制
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消息,接收响应,解析它,然后提取所需的信息。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-01-10 01:50:25

除非您的远程系统可以发出事件或以其他方式异步通知您,否则我不认为上述情况是完全不合理的。您需要在sleep()时间和RPC调用产生的时间/负载之间取得平衡,但我认为这是唯一的问题,上面的问题看起来一点也不重要。

票数 16
EN

Stack Overflow用户

发布于 2012-01-10 01:50:52

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

票数 4
EN

Stack Overflow用户

发布于 2012-01-10 04:59:36

你应该(几乎)永远不要使用睡眠,因为它的效率非常低,而且不是一个好的做法。总是使用锁和条件变量,线程之间相互发信号。请参阅Mike Dahlin的Coding Standards for Programming with threads

模板为:

代码语言:javascript
复制
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()
  {
    try{
      lock.lock();
      ...
      while(...){
        c1.awaitUninterruptibly();
      }
      ...
      c2.signal();
    }
    finally{
      lock.unlock();
    }
  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8792786

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档