Thread.sleep()VS Executor.scheduleWithFixedDelay()

rud*_*llo 24 java multithreading thread-sleep scheduledexecutorservice

目标:每隔一段时间执行一次代码.

问题:在性能方面,是否存在显着差异:

while(true) {
    execute();
    Thread.sleep(10 * 1000);
}
Run Code Online (Sandbox Code Playgroud)

executor.scheduleWithFixedDelay(runnableWithoutSleep, 0, 10, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

当然,后一种选择更犹豫不决.然而,我想知道我是否应该开始一项名为"花几天时间重构遗留代码以告别Thread.sleep()"的冒险.

更新:此代码在超级/超级/超高负载环境中运行.

Ste*_*ker 11

你正在处理几十秒钟的睡眠时间.通过改变睡眠选项可能节省的成本可能是纳秒或微秒.

我每次都更喜欢后一种风格,但是如果你有前者,而且要改变它会花费你很多,"改善性能"并不是一个特别好的理由.

编辑重新:8000线程

8000线程非常多; 我可能会移动到计划执行程序,以便您可以控制系统上的负载量.关于不同唤醒时间的观点是需要注意的,尽管我认为更大的风险是线程的踩踏,所有线程都在沉睡,然后紧密连续醒来并争夺所有系统资源.

我会花时间把这些全部扔进一个固定的线程池预定执行器.只有最多有限资源可用的同时运行(例如,#cores或#IO路径)加上一些可以获取任何slop.这将以延迟为代价为您提供良好的吞吐量.

使用该Thread.sleep()方法将很难控制正在发生的事情,并且您可能会失去吞吐量延迟.

如果您需要更详细的建议,您可能需要更详细地描述您想要做的事情.