在Java中的大多数线程示例中,通常使用while(true)块,如下所示:
while(true) {
try {
wait()
} catch (Exception ex) {
/*do something*/
}
}
使用while(true)的目的是什么?在什么样的情况下他们特别有用? 客户端/服务器通信?
谢谢,
- 伊瓦尔
答案 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。 (显然,这取决于调用notify
或notifyAll
的任何应用程序逻辑。)因此我们(重新)检查条件并重试它是否为真。 那是while (true)
。
必须在wait()
上的监视器锁内执行this
调用,并假设此锁正在保护someCondition
正在检查的状态。
另一件棘手的事情是处理InterruptedException
可能抛出的wait()
。有些人认为压扁它是可以的。事实上,正确的做法是传播它或调用Thread.interrupt()
再次设置中断标志,并停止线程当前正在做的任何事情。如果你不这样做,线程实际上会忽略中断......这是一件坏事。
FWIW - 捕捉Exception
而不是InteruptedException
是不好的做法,可能是错误。
答案 3 :(得分:0)
while true会导致无限循环停止线程终止,例如,您不希望等待客户端连接的服务器只检查一次然后停止检查,您希望服务器继续检查并且过度。如果出现问题,使用while循环可以break;
出循环。
答案 4 :(得分:0)
这是一个无限循环,因此线程会无限期地等待,直到出现异常(很可能是InterruptedException
)。
这个例子本身没有多大意义,通常你会在wait()之后做一些事情,然后等待另一个线程的下一个通知。然后,您可以使用while(true)
无限期地等待通知,执行某些操作,然后再次等待,直到应用程序抛出异常或某些条件来解决循环问题。