线程 - 为什么我们在等待时使用while(true)

时间:2011-06-27 08:51:23

标签: java multithreading

在Java中的大多数线程示例中,通常使用while(true)块,如下所示:

while(true) {
 try {
  wait() 
 } catch (Exception ex) {
   /*do  something*/ 
 }
}

使用while(true)的目的是什么?在什么样的情况下他们特别有用? 客户端/服务器通信?

谢谢,
- 伊瓦尔

5 个答案:

答案 0 :(得分:4)

当我们创建线程池和可重用线程时,将使用这种构造。基本上while(true)构造会阻止池的线程退出。

一个示例是生产者 - 消费者情况,其中线程wait()直到队列为空,并且一旦队列有数据,它们就是notify()并且其中一个线程消耗数据从队列中进行处理,然后返回wait()以获取其他数据再次到达。

答案 1 :(得分:1)

while(true)如果你想在代码运行时一直做某事并且不知道你需要多久做一次,那么它是有用的。

客户端/服务器通信是一种情况。其他场景是游戏动画或保持某些值始终是最新的。

线程与其他代码分开,因此使用while(true)时应用程序不会挂起。

向你的while(true)-loop添加一个exit-flag非常有用,所以你可以根据需要停止它。

Boolean isExit = false; //set this value to true when needed.
while(true) {
 try {
  if(isExist){
    break;
  }
  wait() 
 } catch (Exception ex) {
   /*do  something*/ 
 }
}

答案 2 :(得分:1)

这是在Java中实现条件变量的方法:

synchronized (this) {
  while (true) {
    try {
      wait();
      if (someCondition) {
        break;
      }
    } catch (InterruptedException ex) {
      // handle the 'interrupt' case ...
    }
  }
  // Do something that depended on the condition being true.
}

wait调用等待,直到某个其他线程在notify上执行this,可能是说条件现在为真。但是,在当前线程唤醒或多个线程被唤醒之前,条件可能已变为false。 (显然,这取决于调用notifynotifyAll的任何应用程序逻辑。)因此我们(重新)检查条件并重试它是否为真。 while (true)

的要点

必须在wait()上的监视器锁内执行this调用,并假设此锁正在保护someCondition正在检查的状态。

另一件棘手的事情是处理InterruptedException可能抛出的wait()。有些人认为压扁它是可以的。事实上,正确的做法是传播它或调用Thread.interrupt()再次设置中断标志,并停止线程当前正在做的任何事情。如果你不这样做,线程实际上会忽略中断......这是一件坏事。


FWIW - 捕捉Exception而不是InteruptedException是不好的做法,可能是错误。

答案 3 :(得分:0)

while true会导致无限循环停止线程终止,例如,您不希望等待客户端连接的服务器只检查一次然后停止检查,您希望服务器继续检查并且过度。如果出现问题,使用while循环可以break;出循环。

答案 4 :(得分:0)

这是一个无限循环,因此线程会无限期地等待,直到出现异常(很可能是InterruptedException)。

这个例子本身没有多大意义,通常你会在wait()之后做一些事情,然后等待另一个线程的下一个通知。然后,您可以使用while(true)无限期地等待通知,执行某些操作,然后再次等待,直到应用程序抛出异常或某些条件来解决循环问题。