![](/img/trans.png)
[英]What is the best way to spawn a Thread with an infinite loop in Java 8?
[英]What is the best way to create an infinite loop in java?
我有一个程序,需要一个无限循环来保持运行。 这样做的原因是我有一个SQS消费者,它将为每个消息分离一个线程,这就是我的大部分逻辑。 可悲的是,SQS消费者内部运行在另一个我无法控制的线程上,因为最好的实现是在主线程上运行它。
我需要一种方法来阻止程序在消费者活着时退出,目前我正在使用带有线程休眠的while循环,但我记得有些事情不是一个非常好的解决方案。
当给定约束我无法改变SQSConsumer时,最好的方法是保持程序活着。
更新:程序不打算永远停止,SQSConsumer将启动10个从服务中提取消息的线程,我希望它继续执行此操作,直到我通过将consumer.isRunning()设置为false强制程序退出,或者通过强制程序以Ctrl + c终止。
例:
SQSConsumer consumer = new SQSConsumer((event) -> {
callSomeLogicHere(event);
});
while (consumer.isRunning()) {
Thread.sleep(100);
}
使用CountdownLatch
:
在调用使用者之前创建最终(或有效最终)变量:
CountdownLatch latch = new CountdownLatch(1);
在你的lambda中,用try / finally包围对其他逻辑的调用:
try { callSomeOtherLogic(); } finally { latch.countDown(); }
之后,在你想等待消费者完成的地方,等待闩锁:
latch.await();
请注意,这不是“最好”的方法,因为一般来说很少有客观的最佳方法; 对于特定的应用程序,只有最好的。
话虽如此,这比轮询更好 ,因为您不必继续检查其他线程是否已完成。 如果你每100ms检查一次完成,而另一个线程需要至少10分钟才能完成,那就浪费了大量的时间; 你可以使用你的CPU做更有价值的工作。 您可以增加睡眠时间以减少检查次数,但是然后增加完成和检测它的过程之间的预期额外等待时间(预期的额外等待时间是睡眠持续时间的一半)。
还应注意,这假设lambda的完成表明消费者已完成。 这可能不是真的:
简而言之,对于这种情况,这不一定是最好的,甚至是正确的方法。 但是,有一整套并发实用程序 - java.util.concurrent
- 提供比简单轮询更好的功能,其中一些在这种情况下可能是合适的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.