我有一个服务器程序,它轮询数据库中的新请求,我希望这个轮询每隔1分钟完成一次,所以,我在循环中设置了一个Thread.sleep()。
问题在于,无论何时该程序应该“休眠”,CPU消耗量都会急剧上升(即大约25-30%)。
矛盾的是,当程序没有休眠并忙于处理请求时,CPU消耗降至0.4%。
我在线阅读并发现有与thread.sleep相关的性能命中,但我找不到任何可行的替代方案(Thread.wait需要通知对象,我认为在我的场景中没用)
主循环(当没有新请求时)没有做任何事情,这是当CPU消耗为25%时所做的所有工作的骨架
- >民意调查
- >没有新记录?
- >睡觉
- >重复
答案 0 :(得分:7)
检查各个CPU内核的CPU消耗量。如果你使用的是4核机器,也许有一个线程会变得流氓并且正在吃掉核心(25%)。这通常发生在线程处于紧密循环中时。
你可以使用Thread.wait
超时(确实Timer
类确实如此),但我的赌注是它不会有任何区别。 Thread.sleep
和Thread.wait
都会将线程的状态更改为not runnable
。虽然它取决于你的JVM实现等,但在这种情况下线程不应该消耗那么多的CPU。所以我的赌注是工作中存在一些错误。
您可以做的另一件事是进行线程转储,看看线程在发生这种情况时正在做什么。如果您使用的是Windows,请在Linux机器上使用kill -3
,或在java控制台窗口中使用ctrl + break。然后,检查转储到标准输出的线程转储。然后你可以确定线程是否实际上正在睡觉或正在做其他事情。
答案 1 :(得分:3)
正如许多人所指出的,Thread.sleep应该并且实际上有助于大幅降低CPU使用率。
我从原来的问题中省略了某些事实,因为我认为它们不相关
主线程是生产者,还有另一个异步运行的线程,即消费者。事实证明,这个线程上的“睡眠”是在一些奇怪的情况下,没有被正确触发。所以那个线程上的循环从不睡觉
一旦睡眠的东西被消除,我就继续进行分析,以实现这个问题。