2011-04-11 132 views
17

有人请提供解释说明当JVM在Linux上只有单一进程时,Java多线程程序(例如Tomcat servlet容器)是否能够使用CPU的所有内核?是否有详细描述该主题的良好深度文章?Java多线程程序如何能够使用多个CPU内核?

编辑#1:我不是在寻找建议如何在Java中实现多线程程序。我正在寻找JVM内部如何管理在linux/windows上使用多个内核的解释,同时仍然是OS上的单个进程。我设法找到的最佳解释是Hotspot(Sun/Oracle JVM)在Linux上使用NPTL实现线程作为原生线程。因此,Java中的每个线程更少是Linux上的轻量级进程(本地线程)。使用ps -eLf命令清楚可见,打印输出不仅是进程ID(PPID),还有本地线程ID(LWP)。

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

编辑#3:维基百科有一些进一步的引用上NPTL短,但不错的入门http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library

+1

我想你可能这是一个老黑客以支持线程,而从操作系统的线程支持“绿色线程”相混淆。虽然今天可能会出现类似的黑客攻击,但大多数操作系统都支持线程。 – 2011-04-11 14:04:40

+0

操作系统完成真正的工作,Java只是以与大多数其他多线程应用程序相同的方式使用它。 – 2011-04-11 16:35:35

回答

11

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

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

+1

我认为有必要提到Hotspot(Sun/Oracle JVM)将线程实现为Linux上的本机线程(轻量级进程) – 2011-04-11 15:10:06

+0

虽然问题特别提到了有关JVM的问题,但值得注意的是,并非所有的Java虚拟机都支持native线程(在某些情况下,本地线程甚至不可用) - 这在嵌入式系统上更常见。 – skeggse 2015-02-17 19:42:40

2

我会从阅读Concurrency Tutorial

特别是,它解释了processes and threads之间的差异(和关系)。

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

+0

我会说OP知道这一点。问题的关键在于为什么JVM显示为单一进程,但仍使用多个内核,Joachim已经解释过。 – Thomas 2011-04-11 14:02:50

+0

我对不清楚的道歉,但我没有找到如何在Java中实现多线程程序的建议。我正在寻找JVM内部如何管理在linux/windows上使用多个内核的解释,同时仍然是OS上的单个进程。 – 2011-04-11 14:03:11

4

JVM是一个包含多个线程的单进程。每个线程可以安排在不同的CPU内核上。一个进程可以有很多线程。

当运行在JVM内部的Java软件要求另一个线程时,JVM启动另一个线程。

这就是JVM如何管理使用多个核心。