Java:如何在每个处理器核心上生成多个线程?

Java:如何在每个处理器核心上生成多个线程?,java,multithreading,cpu-usage,Java,Multithreading,Cpu Usage,我有一个java应用程序,我想让它利用多核处理器,我如何利用它们?仅仅产生一个新线程就可以了吗?就像操作系统决定将线程放在哪个内核上一样?是的,操作系统可以完全控制将线程放在哪个内核上(至少在Java中是这样)。你不应该为这些事担心只需生成线程,让操作系统来完成工作。如果您想利用多核处理器,请尝试确定可以并行运行代码的位置。然后为并行代码创建线程。你不需要考虑为处理器核心分配线程,操作系统会这样做。就像其他人说的那样,调度本身是由操作系统自动完成的 但您仍然需要考虑线程策略。例如,您是否应该只使

我有一个java应用程序,我想让它利用多核处理器,我如何利用它们?仅仅产生一个新线程就可以了吗?就像操作系统决定将线程放在哪个内核上一样?

是的,操作系统可以完全控制将线程放在哪个内核上(至少在Java中是这样)。你不应该为这些事担心只需生成线程,让操作系统来完成工作。

如果您想利用多核处理器,请尝试确定可以并行运行代码的位置。然后为并行代码创建线程。你不需要考虑为处理器核心分配线程,操作系统会这样做。

就像其他人说的那样,调度本身是由操作系统自动完成的

但您仍然需要考虑线程策略。例如,您是否应该只使用一个线程,因为它足以解决您的问题?或者应该使用可用的核心线程数,因为您的算法在CPU密集型计算上花费的时间最多?或者您应该使用更像2*的可用核心线程数,因为涉及到一些网络?是否应该使用可重新调整大小的缓存线程池?如果是这样的话,在没有工作负载的情况下需要维护多少线程,在工作负载短暂增加后需要多长时间才能保持更大的池大小,等等


简单的经验法则是,1)使用单线程,除非您有理由使用多线程;2)使线程池大小可配置,然后通过反复试验找到足够好的池大小(我倾向于使用固定大小的线程池,因为它使事情变得简单)

正如其他人所说,操作系统决定应用程序可以使用多少内核,并处理Java线程到内核的分配。因此,第一步的答案就是创建线程,让操作系统来处理它

但是要小心。如果您只是创建了“很多线程”,那么您的应用程序很可能不会运行得更快。事实上,几乎可以肯定的是,在某一点上,新线程实际上会使应用程序变慢。(不幸的是,这一点是特定于应用程序的……而且很难预测。)

要有效利用多核处理器,您需要:

  • 设计您的应用程序,使其能够并行完成有用的大型任务
  • 设计数据结构和算法以避免并发瓶颈
  • 使用线程池或类似的方法来避免线程数量爆炸
  • 配置并优化应用程序

说“操作系统拥有完全控制权”是不准确的。诚然,纯Java无法实现这种控制,但可以通过直接告诉操作系统来实现。在Linux上,可以通过调用
taskset
并将Java线程固定到内核来完成。可能可以通过调用
Runtime.exec()