簡體   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