【发布时间】:2014-04-29 22:37:39
【问题描述】:
最近,我开始了解 Java 7 fork/join 框架 - 我了解到它可以用于解决类似分而治之的问题。
我的问题是,框架是否保证在不同的 CPU 上执行线程?或者是否可以指示我使用并发包类创建的线程在我的服务器中可用的单独 CPU 上运行?
【问题讨论】:
标签: java multithreading fork-join
最近,我开始了解 Java 7 fork/join 框架 - 我了解到它可以用于解决类似分而治之的问题。
我的问题是,框架是否保证在不同的 CPU 上执行线程?或者是否可以指示我使用并发包类创建的线程在我的服务器中可用的单独 CPU 上运行?
【问题讨论】:
标签: java multithreading fork-join
它将建立在标准的 JVM 并发原语之上,在这种情况下,它们将(最终)被调度到真正的操作系统线程上。您不能保证您的操作系统调度程序会将线程调度到单独的 CPU 上,尽管在大多数情况下很有可能。
试图猜测并发调度程序在运行时会做什么是一个非常糟糕的主意。假设您可以使用的 CPU 数量不超过活动线程的数量,并且除非您尝试执行特定类型的非常低级别的操作,否则不要尝试事后猜测运行时行为优化。
【讨论】:
至少它会尽力而为。 fork/join 框架旨在利用多个处理器。默认情况下,创建 ForkJoinPool 时工作线程的数量等于处理器的数量。
【讨论】:
框架是否保证在不同的 CPU 上执行线程?
没有。没有保证。
或者是否可以指示我使用并发包类创建的线程在我的服务器中可用的单独 CPU 上运行?
不使用标准 Java 库。从理论上讲,如果您愿意在 JVM 的本机层中进行挖掘,任何事情都是可能的(在操作系统允许的范围内)。但是你会承担很多不必要的工作/痛苦。
我的建议:
您可能不需要那种级别的控制。 (IMO) 本机线程调度程序的默认行为很可能“足够好”以实现令人满意的性能。
如果您真的需要这种级别的控制,最好使用不同的编程语言;即您可以直接与主机操作系统的本机线程调度程序交互的地方。您甚至可能需要不同的操作系统...
【讨论】: