我有一个多线程JAVA应用程序运行在一个有N个内核的CPU上(在Linux上),但是它只使用第0个内核,其余的内核是空闲的

我有一个多线程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

若我并没有错的话,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
    实用程序获取应用程序的线程转储,并查看stacktrace以查看线程在做什么,以及为什么一个线程被阻塞

  • 使用调试器等运行应用程序

  • 不要把时间浪费在研究调度程序、线程关联或诸如此类的事情上。他们不大可能帮你解决这个问题


嗨!请拿着(您得到了一个徽章!),四处看看,并通读,特别是我们无法帮助您处理我们看不到的代码。:-)请用一个例子来更新您的问题,说明仅使用单个核心的问题。(最有可能的解释是——恕我直言!——您没有正确启动线程。)请还包括您的配置(操作系统等)的详细信息。您好,很高兴看到您正在使用的代码。下面的帖子可能很有用:没有给定的代码很难回答。快速猜测一下:您是否碰巧使用了
Thread.run()
而不是
Thread.start()
?@Ametzaga,@MarkusBauer:这是Thread.start()。您如何看到哪个内核忙,哪个内核空闲?感谢您的输入。其中大多数是并行运行的异步调用/线程(不一定相互依赖或依赖于一个特定的资源)。但即便如此,它们只在一个内核上运行。这使我困惑。我确信我在配置级别遗漏了一些东西,这可能是一个愚蠢的错误。关于类结构,它几乎是一样的(我已经写了一个蓝图)。我将再次尝试调试,并将探索
jstack
实用程序,但是否还有这种奇怪行为的可能性?请点击这个问题,从其他人那里获得更多的视图。最有可能导致您的问题的原因是您的代码。如果看不到它(或者一个复制这种行为的MCVE),我就无法推测我已经说过的。我想其他人也帮不了你。