Java 这到底是怎么回事?(ForkJoin)
我编写了以下代码片段:Java 这到底是怎么回事?(ForkJoin),java,recursion,fork-join,Java,Recursion,Fork Join,我编写了以下代码片段: static private int counter; public void compute() { if (array.length<=500) { for(int i = 0;i<array.length;i++){ counter++; System.out.println("Ciao this is a recu
static private int counter;
public void compute()
{
if (array.length<=500)
{
for(int i = 0;i<array.length;i++){
counter++;
System.out.println("Ciao this is a recursive action number"+ counter+Thread.currentThread().getName());
}
}
else{
int split = array.length/2;
RecursiveActionTry right = new RecursiveActionTry(split);
RecursiveActionTry left = new RecursiveActionTry(split);
invokeAll(right, left);
静态私有整数计数器;
公共空间计算()
{
if(array.lengthinvokeAll()
调用许多在不同线程上独立执行的任务。这并不需要为每个线程使用不同的内核,但如果可用,它可以允许为每个线程使用不同的内核。详细信息由底层计算机处理,但本质上是这样的(简单地说)如果可用的内核少于线程,它会对线程进行时间切片,以便允许一个线程在一个内核上执行一段时间,然后在另一个内核上执行另一段时间(在循环中)
顺便问一下,如果有两个以上的参数,它会在第一个参数上调用compute(),在所有其他参数上调用fork吗
它将compute()。(但是,将其拆分为两种以上的方式是不寻常的-fork join通常通过每个递归将工作负载拆分为两个(如果需要)。任务和工作线程是不同的:
WorkerThreads由ForkJoinPool管理,如果使用默认构造函数,它将根据Runtime.getRuntime().availableProcessors()
启动WorkerThreads
但是,任务是由您创建/管理的。要使多个内核繁忙,您必须启动多个任务。您可以将每个任务分成两部分或N部分。当一部分直接执行时,另一部分将放入等待队列。如果池中的任何其他WorkerThread空闲且没有工作要做,则应将其“窃取”您可以从队列中分叉挂起的任务,并并行执行它们
要使8个内核/WorkerThread忙碌,不必一次调用8个任务。至少分为两个任务就足够了,这两个任务也会再次分叉(递归),直到所有WorkerThread都饱和为止(假设您的整个问题分解为那么多子任务)。
因此,如果您有更多或更少的内核,则无需修改代码,并且您的任务根本不应该担心WorkerThread管理
最后,invokeAll()或join()在所有任务运行后返回