繁体   English   中英

为什么 Sonar 建议避免使用 Thread.sleep?

[英]Why does Sonar recommend avoiding Thread.sleep?

根据这份文件(规则)S2925 https://rules.sonarsource.com/java/RSPEC-2925我们需要将Thread.sleep更改为:

await().atMost(2, Duration.SECONDS).until(didTheThing())

有人可以给我任何合乎逻辑的答案,为什么我们需要这样做?

当此Awaitility class 在后端创建线程时。 这条规则的意义何在?

这是您的合乎逻辑的原因:

Thread.sleep(2000);

将阻塞当前线程至少 2 秒。

相比之下:

await().atMost(2, Duration.SECONDS).until(didTheThing());

或等效代码将阻塞当前线程最多 2 秒,并在事件发生时停止等待。

后者反应更快。

sleep()可能更可取的唯一情况是线程不等待与另一个 Java 线程相关的事件。 即便如此, sleep最终可能会等待比您要求的时间更长的时间,因此它不适合“实时”计时。

这个特定的警告是在测试代码的上下文中,但反对使用sleep()的建议更普遍。


我以前从未遇到过Awaitility ,但它似乎旨在使编写需要计时检查的单元测试变得更容易。 在问题的例子中......它似乎可以让你的测试运行得更快!

正如评论者指出的那样,该规则的文档解释了推理本身:

Thread.sleep不应在测试中使用

在测试中使用Thread.sleep通常不是一个好主意。 它会创建脆弱的测试,这些测试可能会根据环境(“在我的机器上通过”)或负载而无法预测地失败。 不要依赖时机。 使用模拟或使用Awaitility等库进行异步测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM