如何使Java与线程一起使用多个核心?

时间:2012-09-21 17:00:35

标签: java multithreading

这与出现在How to ensure Java threads run on different cores的问题类似。但是,在Java中可能会有很多进展,而且,我在这个问题上找不到我想要的答案。

我刚刚编写了一个多线程程序。该程序产生了几个线程,但它似乎没有使用多个线程。程序 更快(我正在并行化一些使其更快的东西),但它肯定不会使用所有可用的核心,从运行“top”来判断。

有什么想法吗?这是预期的行为吗?

一般代码结构如下:

   for (some values in i)
   {
        start a thread of instantiated as MyThread(i)
        (this thread uses heavily ConcurrentHashMap and arrays and basic arithmetic, no IO)
        add the thread to a list T
   }

   foreach (thread in T)
   {
        do thread.join()
   }

2 个答案:

答案 0 :(得分:4)

如果它几乎完全是一个CPU的100%,那就意味着你真的有

  • 一个正在完成所有工作的核心线程,其他人没有做太多。
  • 您锁定的一个资源,只有一个线程有机会运行。

如果您使用大约一个CPU,那么这可能意味着这是您的CPU所拥有的所有工作,因为您正在等待IO(网络和/或磁盘)等内容

我建议您查看VisualVM中的线程状态。它将帮助您确定正在运行的线程,并为您提供理想的行为模式。我还建议你使用CPU分析器来帮助找到你的瓶颈。

答案 1 :(得分:1)

我想我在SCJP book by Katherine Sierra中读到JVM要求底层操作系统为每个Java线程创建一个新的OS线程。

因此,由底层操作系统决定如何在可用CPU之间平衡Java(和任何其他类型)线程。