Java多线程程序如何能够使用多个CPU内核?

2022-09-03 01:52:19

有人可以解释一下,当JVM在Linux上只有一个进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有内核?有没有好的深入文章详细描述了这个主题?

编辑#1:我不是在寻找如何在Java中实现多线程程序的建议。我正在寻找JVM如何在内部设法在linux / windows上使用多个内核的解释,同时仍然是操作系统上的单个进程。

编辑#2:我设法找到的最好的解释是Hotspot(Sun / Oracle JVM)使用NPTL在Linux上实现线程作为本机线程。因此,Java中的每个线程在Linux上都是轻量级进程(本机线程)。使用命令不仅打印出进程 ID () 而且输出本机线程 ID () 的命令,它清晰可见。ps -eLfPPIDLWP

更多细节也可以在这里找到:

编辑#3:维基百科在NPTL上有简短但不错的条目,并有一些进一步的参考 http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library


答案 1

Linux 内核支持线程作为一等公民。实际上,对于内核来说,线程与进程没有太大区别,只是它与另一个线程/进程共享地址空间。

默认情况下,一些旧版本甚至为每个线程显示一个单独的进程,而较新版本可以使用标志启用此行为。ps-m


答案 2

JVM 是具有许多线程的单个进程。每个线程都可以在不同的 CPU 内核上调度。单个进程可以有多个线程。

当在 JVM 中运行的 Java 软件请求另一个线程时,JVM 将启动另一个线程。

这就是JVM设法使用多核的方式。