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

时间:2011-04-11 13:57:36

标签: java multithreading jvm

有人可以解释一下,当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 :维基百科在NPTL上有简短但很好的条目,还有一些参考文献http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library

4 个答案:

答案 0 :(得分:11)

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

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

答案 1 :(得分:4)

JVM是一个包含许多线程的单个进程。每个线程都可以在不同的CPU核心上进行调度。单个进程可以有很多线程。

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

这就是JVM如何设法使用多个核心。

答案 2 :(得分:3)

如果您使用并发库并尽可能多地拆分您的工作,JVM应该处理剩下的工作。

看看这个http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/

答案 3 :(得分:2)

我首先阅读Concurrency Tutorial

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

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