![](/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.