gpt4 book ai didi

java - 使用 Thread.sleep 线程 hibernate 时的 CPU 消耗

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:00:06 24 4
gpt4 key购买 nike


我有一个服务器程序可以轮询数据库以获取新请求,我希望每隔 1 分钟进行一次轮询,所以我在程序中设置了一个 Thread.sleep() while 循环。
问题是每当这个程序应该“hibernate ”时,CPU 消耗就会急剧上升(即大约 25 - 30%)。
矛盾的是,当程序不处于 hibernate 状态,忙于处理请求时,CPU 消耗下降到 0.4%。
我在网上阅读并发现与 thread.sleep 相关的性能下降,但我找不到任何可行的替代方案(Thread.wait 需要通知对象,我觉得这在我的场景中是无用的)

主循环(当没有新请求时)不做任何事情,这是当 CPU 消耗为 25% 时正在做的所有事情的框架

->投票
-> 没有新记录?
-> sleep
->重复

最佳答案

检查各个 CPU 内核的 CPU 消耗情况。如果您使用的是 4 核机器,则可能有一个线程正在运行,并且正在消耗一次核心 (25%)。这通常发生在线程处于紧密循环中时。

您可以将 Thread.wait 与超时一起使用(Timer 类的确如此),但我敢打赌这不会有任何区别。 Thread.sleepThread.wait 都将线程的状态更改为不可运行。尽管这取决于您的 JVM 实现等,但在这种情况下线程不应消耗那么多 CPU。所以我敢打赌,有一些错误在起作用。

您可以做的另一件事是获取线程转储并查看发生这种情况时线程正在做什么。在 Linux 机器上使用 kill -3,或者如果您使用的是 Windows,则在 java 控制台窗口上使用 ctrl+break。然后,检查转储到标准输出的线程转储。然后您可以确定线程是否真的在 hibernate 或正在做其他事情。

关于java - 使用 Thread.sleep 线程 hibernate 时的 CPU 消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7764497/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com