Javamultithreading程序如何使用多个CPU内核?
有人可以解释一下,当JVM只是linux上的单个进程时,Javamultithreading程序(例如Tomcat servlet容器)如何能够使用所有CPU内核? 是否有任何好的深入文章详细描述了这个主题?
编辑#1 :我不是在寻找如何在Java中实现multithreading程序的建议。 我正在寻找JVM内部如何在linux / windows上使用多个内核同时仍在操作系统上进行单一处理的解释。
编辑#2 :我设法找到的最佳解释是Hotspot(Sun / Oracle JVM)使用NPTL在Linux上将线程实现为本机线程。 因此,Java中的每个线程都是Linux上的轻量级进程(本机线程)。 使用ps -eLf
命令可以清楚地看到,打印输出不仅包括进程ID( PPID
),还包括本机线程ID( LWP
)。
更多细节也可以在这里找到:
- http://www.velocityreviews.com/forums/t499841-java-5-threads-in-linux.html
- 区分Java线程和OS线程?
编辑#3 :维基百科在NPTL上有简短但很好的条目,还有一些参考文献http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library
Linux内核支持线程作为一等公民。 事实上,对于内核,线程与进程没有太大的不同,除了它与另一个线程/进程共享一个地址空间。
某些旧版本的ps
甚至默认为每个线程显示一个单独的进程,较新的版本可以使用-m
标志启用此行为。
JVM是一个包含许multithreading的单个进程。 每个线程都可以在不同的CPU核心上进行调度。 单个进程可以有多个线程。
当在JVM内运行的Java软件要求另一个线程时,JVM启动另一个线程。
这就是JVM如何设法使用多个核心。
如果您使用并发库并尽可能多地拆分您的工作,JVM应该处理其余的工作。
看看这个http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/
我将从阅读并发教程开始 。
特别是,它解释了进程和线程之间的差异(和关系)。
在我熟悉的体系结构中,线程(包括JVM创建的线程)由操作系统管理。 JVM只使用操作系统提供的线程function。