这与出现在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()
}
答案 0 :(得分:4)
如果它几乎完全是一个CPU的100%,那就意味着你真的有
如果您使用大约一个CPU,那么这可能意味着这是您的CPU所拥有的所有工作,因为您正在等待IO(网络和/或磁盘)等内容
我建议您查看VisualVM中的线程状态。它将帮助您确定正在运行的线程,并为您提供理想的行为模式。我还建议你使用CPU分析器来帮助找到你的瓶颈。
答案 1 :(得分:1)
我想我在SCJP book by Katherine Sierra中读到JVM要求底层操作系统为每个Java线程创建一个新的OS线程。
因此,由底层操作系统决定如何在可用CPU之间平衡Java(和任何其他类型)线程。