java - Thread.sleep() VS Executor.scheduleWithFixedDelay()

标签 java multithreading thread-sleep scheduledexecutorservice

目标:每隔一段时间执行某些代码。

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

while(true) {
    execute();
    Thread.sleep(10 * 1000);
}

executor.scheduleWithFixedDelay(runnableWithoutSleep, 0, 10, TimeUnit.SECONDS);

?

当然,后一种选择更洁净。然而,我想知道我是否应该开始一次名为“花几天时间重构遗留代码来告别 Thread.sleep()”的冒险。

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

最佳答案

您正在处理以数十秒为单位的 sleep 时间。通过在此处更改 sleep 选项可能会节省纳秒或微秒。

我每次都更喜欢后一种风格,但如果你有前一种,而且要花很多钱来改变它,“提高性能”就不是一个特别好的理由。

编辑回复:8000 个线程

8000 个线程非常多;我可能会转移到预定的执行程序,以便您可以控制系统上的负载量。您关于改变唤醒时间的观点是需要注意的,尽管我认为更大的风险是所有线程都在 hibernate 然后连续醒来并竞争所有系统资源的踩踏事件。

我会花时间把这些都扔到一个固定的线程池调度执行器中。只有尽可能多的同时运行,因为您可以使用最有限的资源(例如,# cores 或 # IO 路径)加上一些来处理任何问题。这将以延迟为代价为您提供良好的吞吐量。

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

如果您需要更详细的建议,您可能需要更详细地描述您想要做什么。

关于java - Thread.sleep() VS Executor.scheduleWithFixedDelay(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13422125/

相关文章:

java - Swing JForm 卡住直到操作完成

java - 有什么方法可以让 Java Web Start 自动安装快捷方式?

python PyQT : How to call a GUI function from a worker thread?

java - "Daemon Thread Image Animator"未完成

android - 如何知道音调发生器何时停止播放

c - 如何检测 C 中的运行时堆栈粉碎/缓冲区溢出并使 gdb 能够以正确的消息正常退出。

java - 使用 Java 8 并行流时松开 Java EE 请求范围是否正常?

java - 如何在 NetBeans 中隐藏/调整 Jframe?

java - 不满意的依赖异常 : Error creating bean with name 'homeController' : Unsatisfied dependency expressed through field 'dao'

c - 与 gcc 链接时 Solaris 和 GNU/Linux 之间的 lpthread 库差异