簡體   English   中英

While 循環中的 Thread.sleep()

[英]Thread.sleep() in While Loop

有一個生產者不斷生成文件並將它們放入一個特殊的路徑中。 消費者是一個使用WatchService來監視路徑並選擇任何新生成的文件來工作。 通常,消費者的速度比生產者慢。 在極少數情況下,如果消費者完成了所有現有任務並且路徑中還沒有新的東西,消費者需要堅持一段時間。

while(true) {
    // do something...
    if(condition) {
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // handler
        }
    }
}

IDE 抱怨calling to Thread.sleep() in a while loop are indicative of "busy-waiting". Busy-waiting is often inefficient, and may result in unexpected deadlocks as busy-waiting threads do not release locked resources calling to Thread.sleep() in a while loop are indicative of "busy-waiting". Busy-waiting is often inefficient, and may result in unexpected deadlocks as busy-waiting threads do not release locked resources 忽略這個 IDE 警告將是我的最后選擇。

我如何更改我的代碼以避免上述警告架構明智?

(看來預定的線程池不能滿足我的要求。如果我錯了,請糾正我。)

感謝您的評論和回答。 從 WatchService 到阻塞隊列的緩沖事件將起作用。

我完全同意 IDE。 如果你使用 Thread.sleep() 你錯了,大多數時候。 如果你不知道為什么,那么你總是錯的。 是的,我知道,這是一個強有力的聲明,但在我看來,應該始終牢記這一點:在最好的情況下,“錯誤”意味着“次優”,在最壞的情況下,“錯誤”可能意味着“糟糕的架構”。

在您的情況下,一種解決方案是使用阻塞隊列,當隊列為空時將消費者發送到睡眠狀態,並在某些元素到達時喚醒睡眠中的消費者。

順便說一句,我也相信當隊列已滿時你也會遇到同樣的問題:你可能想暫停生產者。

完全不建議在實時應用程序中使用 Thread.sleep。 根據您的要求,建議使用調度程序根據您的應用程序流量不時檢查路徑。 任何 cron 工作也會有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM