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