java - 多线程性能

标签 java multithreading performance

我有一个Java应用程序,它运行线程来为每个线程执行N次某项工作,并且可以设置线程数。 每个线程的每次作业迭代需要 20 秒到 1-1.5 分钟。每个线程必须为该作业执行大约 25000-100000 次迭代。 因此,之前添加的作业有更多“已完成的作业”,并且它们具有更高的优先级(正如我对 JVM 的看法,但没有设置prioritet,并且它们在编程上具有相同的优先级)。但我需要线程在添加一些新任务后均匀地完成工作。 例如,有 5000 个线程执行 100 项作业,进行 100000 次迭代:

  • 旧工作 #1 正在做
  • 旧工作 #2 正在做
  • ...
  • 旧工作 #100 正在做

但是,当我添加作业 #101 时,我会发现线程的运行速度不如第一个作业。 我使用过yield()和sleep(50),但结果似乎不太好。 那么您能告诉我我做错了什么以及如何为太多线程提供出色的性能吗?

最佳答案

线程是由操作系统调度程序调度的,你不能指望它们按照这样的固定顺序执行。只是每个线程应该有一些来自调度程序的分配时间。如果任务独立于其他任务,那么您无论如何都不应该关心顺序。如果他们不是独立的,那么您应该让他们协作以确保一切都按照适当的顺序执行。

拥有 5000 个线程可能太多了。您的机器有多少个处理器?线程执行的任务是什么。如果它们受 CPU 限制,则最好的选择是让线程数量等于处理器数量,或者处理器数量 + 1。

关于java - 多线程性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8363864/

相关文章:

c# - 当主线程终止时 SynchronizationContext 会发生什么?

c++ - 在内存中处理一些长 vector 时如何不弄乱缓存?

performance - 如何让 PHPUnit + Selenium 运行得更快?

java - 从 tcpflow 输出格式化 IP?

java - 自动装箱性能

java - Swing 灯箱效果

java - Android开发-数据库插入空指针异常

c# - 为什么这里要用锁?

c++ - 如何在Worker Thread中编写简单的后台线程

algorithm - 确定一个数字的总和是否包含给定的 2 的幂