Thread.sleep() 在 While 循环中

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。忽略此 IDE 警告将是我最后的选择。

我如何更改我的代码以避免上述架构警告?

(看来调度线程池不能满足我的要求,如有错误请指正。)

感谢您的评论和回答。从 WatchService 到阻塞队列的缓冲事件将起作用。

我完全同意IDE。如果你使用 Thread.sleep() 你错了,大多数时候。如果你不知道为什么,那么你一直都是错的。是的,我知道,这是一个强有力的声明,但在我看来,应该始终牢记:在最好的情况下,“错误”意味着“次优”,在最坏的情况下,“错误”可能意味着“糟糕的架构”。

对于您的情况,一个解决方案是使用阻塞队列,当队列为空时让消费者进入睡眠状态,并在某些元素到达时唤醒睡眠中的消费者。

顺便说一句,我相信当队列已满时您也有同样的问题:您可能想要暂停生产者。

完全不推荐在实时应用程序中使用Thread.sleep。根据您的要求,建议使用调度程序根据您的应用程序流量不时检查路径。任何 cron 作业也会有所帮助。