我有一个多线程JAVA应用程序运行在一个有N个内核的CPU上(在Linux上),但是它只使用第0个内核,其余的内核是空闲的
若我并没有错的话,JVM依赖于操作系统的底层架构来调度线程并将其传播到其他内核(当生成线程时)。然而,在我的应用程序中,我没有看到它发生。每个线程都在第0个内核上运行,其余N-1个内核处于空闲状态。发生这种情况的具体原因,以及如何解决这个问题,以便我可以利用我的其余核心 我知道设置流程关联,但在某种程度上,这是将流程硬编码到特定的核心。由于线程可以在任何给定点生成,因此它应该由空闲的内核进行空闲处理 代码片段,例如我有一个多线程JAVA应用程序运行在一个有N个内核的CPU上(在Linux上),但是它只使用第0个内核,其余的内核是空闲的,java,linux,multithreading,parallel-processing,cpu-cores,Java,Linux,Multithreading,Parallel Processing,Cpu Cores,若我并没有错的话,JVM依赖于操作系统的底层架构来调度线程并将其传播到其他内核(当生成线程时)。然而,在我的应用程序中,我没有看到它发生。每个线程都在第0个内核上运行,其余N-1个内核处于空闲状态。发生这种情况的具体原因,以及如何解决这个问题,以便我可以利用我的其余核心 我知道设置流程关联,但在某种程度上,这是将流程硬编码到特定的核心。由于线程可以在任何给定点生成,因此它应该由空闲的内核进行空闲处理 代码片段,例如 public static void main() { R1 r1 = new
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
类中,或者它们所依赖的某个类中。既然你决定不给我们看,我们只能猜测它可能是什么。然而,一个常见的解释是,其中一个线程(运行代码)持有另一个线程试图获取的锁。这足以使您的应用程序有效地实现单线程
忠告:
- 使用
实用程序获取应用程序的线程转储,并查看stacktrace以查看线程在做什么,以及为什么一个线程被阻塞jstack
- 使用调试器等运行应用程序
- 不要把时间浪费在研究调度程序、线程关联或诸如此类的事情上。他们不大可能帮你解决这个问题
Thread.run()
而不是Thread.start()
?@Ametzaga,@MarkusBauer:这是Thread.start()。您如何看到哪个内核忙,哪个内核空闲?感谢您的输入。其中大多数是并行运行的异步调用/线程(不一定相互依赖或依赖于一个特定的资源)。但即便如此,它们只在一个内核上运行。这使我困惑。我确信我在配置级别遗漏了一些东西,这可能是一个愚蠢的错误。关于类结构,它几乎是一样的(我已经写了一个蓝图)。我将再次尝试调试,并将探索jstack
实用程序,但是否还有这种奇怪行为的可能性?请点击这个问题,从其他人那里获得更多的视图。最有可能导致您的问题的原因是您的代码。如果看不到它(或者一个复制这种行为的MCVE),我就无法推测我已经说过的。我想其他人也帮不了你。