multithreading - 当事件模式不适用时,线程应该休眠多长时间?

标签 multithreading

在必须轮询以了解是否有工作要做的工作线程的主循环中,我让它休眠以免忙等待。如何确定合适的 sleep 长度?例如如果我每毫秒醒来一次,那么 sleep 可能根本没用。如果我每十分钟醒来一次,可能会使应用程序看起来没有响应(取决于线程在做什么)。

我在下面 cadrian 所说的之前听说过,人类用户不会注意到大约 100 毫秒的时间跨度,但是从机器端接近它呢?在开始变得浪费之前,间隔可以变得多小?

我想,它归结为 this question 的更通用(即平台无关)版本.

编辑:当然,这个问题应该始终首先改写为“我如何将其更改为事件模式而不是轮询”,但现在让我们假设我不能或不想。

最佳答案

有时投票就是答案 .

但是,它轮询的频率取决于线程在做什么,因此请使其可配置。

我们有线程可以检查电子邮件。他们可以检查外部邮箱,我们每三十秒左右只检查一次邮箱(但它是可配置的)。每次检查都是通过网络调用,每秒调用一次或 10 秒调用一次会破坏网络,30 秒是可以的,如果电子邮件在它进入收件箱的那一刻未被处理并不重要(但是一些客户站点每 5 分钟检查一次)。

我们还有其他线程轮询文件夹中的文件和/或添加到数据库表中的新请求。这些工作每 1 到 5 秒轮询一次(取决于他们在做什么)。

现在无论您在轮询之间等待多长时间,我们都不会让任何线程休眠超过一秒。原因是,如果您尝试停止一个线程休眠 60 秒的 Windows 服务,您可能在服务停止前等待 60 秒。

如果您需要赶紧将机器停机,Rip Van Winkle 线真的会扭曲您的西瓜。

因此,让您的轮询间隔尽可能远,但 sleep 时间不要超过一秒钟。

希望这可以帮助

关于multithreading - 当事件模式不适用时,线程应该休眠多长时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582367/

相关文章:

c++ - 如何在 Linux 中观察变量

java - 识别能够更新 UI 组件的线程

javascript - 浏览器中的JavaScript是否可能发生并发读/写读/写冲突?

Java Swing 多线程管理与观察者模式

具有内部类的 Java Singleton - 什么保证线程安全?

c - 这些线程中的每一个是否都会等到互斥体解锁后才能执行某项功能?

python - 在进程中安全运行代码,在 multithreading.Process 中重定向 stdout

java - 如何使流减少线程安全?

Java sleep 中断异常

java - AtomicInteger 等原子包类如何工作