如果我没记错的话,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();
}有什么建议吗?
发布于 2018-09-04 19:39:39
几乎可以肯定的是,您的应用程序中有一些东西导致JVM不能同时运行多个应用程序线程。
问题将出现在R1和R2类中,或者它们所依赖的其他类中。既然你决定不向我们展示它们,我们只能猜测它可能是什么。然而,一种常见的解释是,其中一个线程(运行您的代码)持有另一个线程试图获取的锁。这足以使您的应用程序有效地单线程。
建议:
jstack实用程序来获取应用程序的线程转储,并查看堆栈跟踪以了解线程在做什么,以及其中一个线程被阻塞的原因。https://stackoverflow.com/questions/52161533
复制相似问题