JAVA的线程能够在多个CPU上执行么?

    这个是我一个技术相当好的哥们去面试的时候碰到的奇葩问题,那天,这个面试官的答案是不能。后来就带着这个问题去国内外的论坛上搜了一把。也是各说纷纭。实在是没有一个统一的答案。简直有点公说公有理。婆说婆有理的架势。

    几个意见大致例如以下,第一,不能,由于“进程是CPU进行调度的单位。而JVM是一个进程。于是就仅仅能跑在一个CPU上”。第二,“进程是CPU进行调度的单位。这没错。可是OS负责将一个进程在不同的CPU上调度到另外一个CPU上。而这个进程,则是由不同的线程构成的,那么说,线程还是在不同的CPU上执行了”。

我更倾向于另外一种解释。于是核心问题就变成了讨论“JVM能不可以将线程安排到不同的CPU上去执行呢?”。


    终于,在SUN公司授权的《Java核心技术》,第7版卷II,第8版卷I。有关于“可执行线程”中。找到例如以下两句话:

    “今天。人们非常可能有单台拥有多个CPU的计算机,可是,并发运行的进程数并非CPU数目制约的。操作系统的时间片分配给每个进程。给人并行处理的感觉”。


    好吧,上面的这句话,并不能说明这个答案,可是当我看到以下的这句原话的时候。感觉答案就在这里了:

    "在具有多个处理器的机器上。每个处理器执行一个线程,能够有多个线程并行执行。

当然,假设线程的数目多于处理器的数目,调度器依旧採用时间片机制"。这句话足以用来反驳那个出问题的人了,由于他的答案本身就是错的。


    虽然,尽信书不如无书,可是,还能有更好的选择么?带着这个问题,继续走下去~ Fighting~  ziwen@163.com  I enjoy PM、Java、Oracle. I'm an English lover as well~ ho ho~

后记:
更具体的信息能够參见有关Java虚拟机实现的“并发”系列解说。基本上每本关于Java虚拟机有关的书籍以及官方文档都会讲到JVM怎样实现线程的几种方式。

基于系统内核。基于用户线程等等实现。JVM中的线程实现是本地化的~ 本地化的意思就是与平台有关了,虽然与平台有关,可是线程调度。仍旧是最佳高效的方式,有资料曾说过:线程的创建销毁与调度的开销是进程的三十分之中的一个。

posted on 2017-06-22 16:12  wgwyanfs  阅读(485)  评论(0编辑  收藏  举报

导航