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

Java多线程程序如何能够使用多个CPU核?,java,multithreading,jvm,Java,Multithreading,Jvm,有人能解释一下当JVM是linux上唯一的单进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有核心吗?有什么好的深入的文章详细描述这个主题吗 编辑#1:我不是在寻找如何在Java中实现多线程程序的建议。我想了解JVM如何在linux/windows上内部管理使用多个内核,同时仍然是操作系统上的单个进程 编辑#2:我找到的最好的解释是Hotspot(Sun/Oracle JVM)使用NPTL在Linux上将线程实现为本机线程。所以Java中的每个线程在Lin

有人能解释一下当JVM是linux上唯一的单进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用CPU的所有核心吗?有什么好的深入的文章详细描述这个主题吗

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

编辑#2:我找到的最好的解释是Hotspot(Sun/Oracle JVM)使用NPTL在Linux上将线程实现为本机线程。所以Java中的每个线程在Linux上都是轻量级进程(本机线程)。使用
ps-eLf
命令,不仅可以打印进程id(
PPID
),还可以打印本机线程id(
LWP

更多详细信息也可在此处找到:


编辑#3:Wikipedia在NPTL上有简短但不错的条目,还有一些进一步的参考资料

我将从阅读

特别是,它解释了两者之间的区别(和关系)


在我熟悉的体系结构上,线程(包括JVM创建的线程)由操作系统管理。JVM只使用操作系统提供的线程功能。

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


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

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

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


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

如果您使用并发库并尽可能多地分割工作,JVM应该处理其余的工作


看看这个

我想OP知道这一点。问题是为什么JVM显示为一个进程,但仍然使用多个核心,Joachim已经解释过了。我很抱歉不清楚,但我不是在寻找如何在Java中实现多线程程序的建议。我想解释一下JVM如何在linux/windows上内部使用多个内核,而在操作系统上仍然是单进程。我想你可能会被“绿色线程”弄糊涂,绿色线程是一种旧的技术,它支持没有操作系统线程支持的线程。虽然今天可能会有类似的黑客攻击,但大多数OSs都很好地支持线程。操作系统完成了真正的工作,Java只是以与大多数其他多线程应用程序相同的方式使用它。我认为有一点很重要,那就是Hotspot(Sun/Oracle JVM)将线程作为Linux(轻量级进程)上的本机线程来实现虽然这个问题是关于JVM的,但也值得注意的是,并非所有java虚拟机都支持本机线程(在某些情况下甚至不支持本机线程)——这在嵌入式系统上更为常见。