Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中创建无限循环的最佳方法是什么?_Java_Multithreading_Loops - Fatal编程技术网

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

在java中创建无限循环的最佳方法是什么?,java,multithreading,loops,Java,Multithreading,Loops,我有一个程序需要无限循环才能保持运行。这是因为我有一个SQS消费者,它将为它得到的每条消息派生一个线程,这就是我的大部分逻辑所在。 不幸的是,SQS使用者内部运行在另一个我无法控制的线程上,因为最好的实现是在主线程上运行它 我需要一种方法来阻止程序在消费者还活着的时候退出,目前我正在使用带有线程睡眠的while循环,但我记得这不是一个很好的解决方案 在我无法更改SQS消费者的情况下,保持程序运行的最佳方法是什么 更新:该程序不打算永远停止,SQS使用者将启动10个从服务中提取消息的线程,我希望它

我有一个程序需要无限循环才能保持运行。这是因为我有一个SQS消费者,它将为它得到的每条消息派生一个线程,这就是我的大部分逻辑所在。 不幸的是,SQS使用者内部运行在另一个我无法控制的线程上,因为最好的实现是在主线程上运行它

我需要一种方法来阻止程序在消费者还活着的时候退出,目前我正在使用带有线程睡眠的while循环,但我记得这不是一个很好的解决方案

在我无法更改SQS消费者的情况下,保持程序运行的最佳方法是什么

更新:该程序不打算永远停止,SQS使用者将启动10个从服务中提取消息的线程,我希望它继续这样做,直到我通过将consumer.isRunning()设置为false或通过强制程序以Ctrl+c终止来强制程序退出

例如:

SQSConsumer consumer = new SQSConsumer((event) -> {
    callSomeLogicHere(event);
});
while (consumer.isRunning()) {
    Thread.sleep(100);
}

使用
倒计时闩锁

  • 在调用使用者之前创建最终(或有效的最终)变量:

    CountdownLatch latch = new CountdownLatch(1);
    
  • 在lambda中,用try/finally将对其他逻辑的调用包围起来:

    try {
      callSomeOtherLogic();
    } finally {
      latch.countDown();
    }
    
  • 然后,在要等待使用者完成的位置,等待闩锁:

    latch.await();
    

注意,这并不是最好的方法,因为通常很少有客观上最好的方法;对于特定的应用程序,只有一个最佳值

话虽如此,这比轮询要好,因为您不必一直检查另一个线程是否已经完成。如果你每100毫秒检查一次是否完成,而另一个线程至少需要10分钟才能完成,那么这是浪费大量的检查;你可以用你的CPU来做更有价值的工作。您可以增加睡眠时间以减少检查频率,但随后会增加进程完成和检测之间的预期额外等待时间(预期额外等待时间为睡眠持续时间的一半)

还应注意,这假设lambda的完成表示消费者的完成。这可能不是真的:

  • 这种方法假设lambda只执行一次。这个假设可能不正确,例如,如果lambda被执行多次,或者可能从未执行过
  • 即使只执行一次,消费者也可能在之后做更多的工作;闩锁倒计时后,您可能需要等待更长的时间(甚至仍然轮询完成)

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

多线程的目的失败了。您能否提供有关SQS Consumer类的更多详细信息?为什么这是最好的方法?我已经更新了我的第一篇文章,提供了更多信息。我认为这行不通,因为lambda函数被称为“无限次”