如果我没记错的话,JVM 依赖于操作系统的底层架构来调度线程并将线程传播到其他内核(当生成线程时)。但是,在我的应用程序中,我没有看到它发生。每个线程都在第 0 个核心上运行,其余 N-1 个核心处于空闲状态。发生这种情况的任何具体原因,更重要的是,如何解决这个问题以便我可以利用我的其余核心?
我知道设置进程亲和性,但在某种程度上,这是将进程硬编码到特定核心。由于线程可以在任何给定点生成,因此它应该由闲置的核心进行闲置处理。
代码片段例如
public static void main() {
R1 r1 = new R1();
R2 r2 = new R2();
Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();
}
有什么建议吗?
最佳答案
几乎可以肯定,您的应用程序中存在某种原因导致 JVM 无法同时运行多个应用程序线程。
问题将出在 R1
和 R2
类中,或者它们所依赖的某些东西中。由于您决定不向我们展示它们,我们只能猜测它可能是什么。然而,一个常见的解释是其中一个线程(运行您的代码)持有另一个线程试图获取的锁。这足以使您的应用程序有效地成为单线程。
建议:
使用
jstack
实用程序获取应用程序的线程转储,并查看堆栈跟踪以了解线程正在做什么以及线程被阻塞的原因。使用调试器等运行应用程序。
不要将时间浪费在调查调度程序、线程亲和性或类似的东西上。他们不太可能帮助您解决问题。
关于java - 我有一个多线程 JAVA 应用程序在具有 N 个内核的 CPU 上运行(在 Linux 上)但是它只使用第 0 个内核而其余内核处于空闲状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52161533/