• 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中的线程实现是本地化的~ 本地化的意思就是与平台有关了,虽然与平台有关,可是线程调度。仍旧是最佳高效的方式,有资料曾说过:线程的创建销毁与调度的开销是进程的三十分之中的一个。

  • 相关阅读:
    深入理解MyBatis中的一级缓存与二级缓存
    Spring-mvc文件的上传和下载
    Spring-mvc的拦截器和异常通知
    各种配置文件
    设计模式---代理模式
    dom4j读取xml和dtd的使用方式
    几种不同的路径
    常用正则表达式
    请求转发和重定向的对比
    跨浏览器检测某个节点是不是另一个节点的后代
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7065591.html
走看看 - 开发者的网上家园