3

这与出现在的问题类似:如何确保 Java 线程在不同的内核上运行。但是,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()
   }
4

2 回答 2

4

如果它几乎是一个 CPU 的 100%,这可能意味着你真的拥有

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

如果您使用大约一个 CPU,这可能意味着这就是您的 CPU 的所有工作,因为您正在等待诸如 IO(网络和/或磁盘)之类的东西

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

于 2012-09-21T17:05:10.047 回答
1

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

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

于 2012-09-21T17:17:36.247 回答