首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间循环中的Thread.sleep()

时间循环中的Thread.sleep()
EN

Stack Overflow用户
提问于 2020-07-03 13:01:59
回答 2查看 1.4K关注 0票数 0

有一个生产者一直在生成文件,并将它们放到一个特殊的路径中。使用者是一个使用WatchService来监视路径和接收任何新生成的文件来工作的用户。通常,消费者的速度比生产者慢。在罕见的情况下,如果使用者完成了所有现有的任务,并且路径中没有什么新的东西,那么使用者需要坚持一段时间。

代码语言:javascript
复制
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到阻塞队列的缓冲区事件将工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-03 13:42:48

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

在您的示例中,解决方案是使用阻塞队列,在队列为空时将使用者发送到睡眠状态,并在某个元素到达时唤醒睡眠消费者。

顺便说一句,我还认为,当队列已满时,您也会遇到同样的问题:您可能需要暂停生产者。

票数 1
EN

Stack Overflow用户

发布于 2020-07-03 17:12:01

不建议在实时应用程序中使用Thread.sleep。对于您的需求,建议使用调度程序根据应用程序通信量偶尔检查路径。任何官员的工作也会有帮助。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62716026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档