有一个生产者一直在生成文件,并将它们放到一个特殊的路径中。使用者是一个使用WatchService来监视路径和接收任何新生成的文件来工作的用户。通常,消费者的速度比生产者慢。在罕见的情况下,如果使用者完成了所有现有的任务,并且路径中没有什么新的东西,那么使用者需要坚持一段时间。
while(true) {
// do something...
if(condition) {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// handler
}
}
}艾德在抱怨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到阻塞队列的缓冲区事件将工作。
发布于 2020-07-03 13:42:48
我完全同意IDE的观点。如果使用Thread.sleep(),大多数情况下都是错误的。如果你不知道为什么,那么你一直都是错的。是的,我知道,这是一个强有力的声明,但在我看来,应该永远记住:在最好的情况下,“错误”意味着“次优”,在最坏的情况下,“错误”可能意味着“糟糕的架构”。
在您的示例中,解决方案是使用阻塞队列,在队列为空时将使用者发送到睡眠状态,并在某个元素到达时唤醒睡眠消费者。
顺便说一句,我还认为,当队列已满时,您也会遇到同样的问题:您可能需要暂停生产者。
发布于 2020-07-03 17:12:01
不建议在实时应用程序中使用Thread.sleep。对于您的需求,建议使用调度程序根据应用程序通信量偶尔检查路径。任何官员的工作也会有帮助。
https://stackoverflow.com/questions/62716026
复制相似问题