繁体   English   中英

在java中创建无限循环的最佳方法是什么?

[英]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的完成表明消费者已完成。 这可能不是真的:

  • 这种方法假设lambda只执行一次。 这种假设可能不正确,例如,如果lambda被执行多次,或者可能永远不执行。
  • 即使只执行一次,消费者也可能会做更多的工作; 锁存器倒计数后,您可能需要等待一段时间(甚至还要完成轮询)。

简而言之,对于这种情况,这不一定是最好的,甚至是正确的方法。 但是,有一整套并发实用程序 - java.util.concurrent - 提供比简单轮询更好的功能,其中一些在这种情况下可能是合适的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM