Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java7 fork/join是否保证在单独的CPU中执行线程_Java_Multithreading_Fork Join - Fatal编程技术网

Java7 fork/join是否保证在单独的CPU中执行线程

Java7 fork/join是否保证在单独的CPU中执行线程,java,multithreading,fork-join,Java,Multithreading,Fork Join,最近,我开始了解Java7 fork/join框架——我学到的是,它对于分而治之的问题非常有用 我的问题是,框架是否保证在单独的CPU上执行线程?或者,事件是否可能指示我使用并发包类创建的线程在我的服务器中可用的单独CPU上运行?它将基于标准JVM并发原语构建,在这种情况下,它们将(最终)被调度到真正的OS线程上。您不能保证您的操作系统调度程序将线程调度到单独的CPU上,尽管在大多数情况下很可能是这样 试图猜测并发调度器在运行时将要做什么是一个非常糟糕的主意。只要假设您能够使用的CPU数量不超过

最近,我开始了解Java7 fork/join框架——我学到的是,它对于分而治之的问题非常有用


我的问题是,框架是否保证在单独的CPU上执行线程?或者,事件是否可能指示我使用并发包类创建的线程在我的服务器中可用的单独CPU上运行?

它将基于标准JVM并发原语构建,在这种情况下,它们将(最终)被调度到真正的OS线程上。您不能保证您的操作系统调度程序将线程调度到单独的CPU上,尽管在大多数情况下很可能是这样


试图猜测并发调度器在运行时将要做什么是一个非常糟糕的主意。只要假设您能够使用的CPU数量不超过活动线程的数量,不要试图猜测运行时的行为,除非您尝试进行某种特定的非常低级的优化。

至少它会尽最大努力。fork/join框架旨在利用多个处理器。默认情况下,创建ForkJoinPool时,工作线程的数量等于处理器的数量

框架是否保证在单独的CPU上执行线程

不,不保证

或者,事件是否可以指示我使用并发包类创建的线程在服务器中可用的单独CPU上运行

不使用标准Java库。理论上,如果您愿意深入研究JVM的本机层,任何事情都是可能的(在操作系统允许的范围内)。但你将面临许多不必要的工作/痛苦

我的忠告是:

  • 你可能不需要那种程度的控制。(IMO)本机线程调度程序的默认行为可能“足够好”以实现令人满意的性能

  • 如果您真的需要这种级别的控制,那么最好使用不同的编程语言;i、 e.可以直接与主机操作系统的本机线程调度器交互的线程调度器。你甚至可能需要一个不同的操作系统


“fork/join框架旨在利用多个处理器”-如何使用基本线程?如果我使用基本线程或线程池,它会利用多处理器吗?基本线程编程有点困难。使用Fork/Join,您可以使用简单的原语,所有线程工作都在幕后完成。您只需创建ForkJoinPool并扩展RecursiveTaskclass@trapo,我担心调度程序是否应该在单独的CPU上运行基本线程,我的意思是在这个意义上(在单独的CPU上调度线程),基本线程与F/J有什么区别吗?谢谢Gian。以前我使用基本线程从db加载一些东西,我是在单独的线程中这样做的。我想,用F/J实现这一点不会带来额外的好处?FJ不适用于基于I/O的任务,而是适用于CPU受限的算法。因此,经验法则可能是:I/O针对线程,CPU使用F/JF/J不太可能提供特定的性能优势,但它可能允许您以更容易理解、优化或解释的方式构造并发代码。Gian,部分不同意。如果用于CPU有界的算法,FJ将为您提供在多个线程上拆分工作的好处,从而从并行执行中获得好处。当然,如果在正确的假设下使用,那么除了使用线程之外,如何给您带来额外的性能优势呢?当然,在许多情况下,并行将提供性能优势,但在其他条件相同的情况下,fork/join不太可能客观上比线程提供更好的性能(反之亦然)。因此,假设我的多线程应用程序本质上不是divide-n-conquer,或者它不起作用(这个概念我不太清楚)-使用F/J执行操作没有比使用基本线程更大的优势?工作窃取意味着递归操作由一个线程分配,可以在ForkJoinPool的另一个空闲线程上执行,将该操作从第一个线程的私有队列移动到另一个线程的队列。谢谢@trapo,你能请给出一些使用盗用作品的代码?是的,我自己的问题(并回答诸如此类的问题):注意不要使用workstealing,但要注意观察它。如果你对F/J感兴趣,我就写了一篇关于它的小帖子。帖子是意大利语的,但最后你可以找到一个关于该主题的用户链接列表:。还有一个类,你可以试着展示任务是如何从一个线程移动到另一个线程的。