Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.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
Java 这到底是怎么回事?(ForkJoin)_Java_Recursion_Fork Join - Fatal编程技术网

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.length
invokeAll()
调用许多在不同线程上独立执行的任务。这并不需要为每个线程使用不同的内核,但如果可用,它可以允许为每个线程使用不同的内核。详细信息由底层计算机处理,但本质上是这样的(简单地说)如果可用的内核少于线程,它会对线程进行时间切片,以便允许一个线程在一个内核上执行一段时间,然后在另一个内核上执行另一段时间(在循环中)

顺便问一下,如果有两个以上的参数,它会在第一个参数上调用compute(),在所有其他参数上调用fork吗


它将
compute()。(但是,将其拆分为两种以上的方式是不寻常的-fork join通常通过每个递归将工作负载拆分为两个(如果需要)。

任务和工作线程是不同的:

WorkerThreads由ForkJoinPool管理,如果使用默认构造函数,它将根据
Runtime.getRuntime().availableProcessors()
启动WorkerThreads

但是,任务是由您创建/管理的。要使多个内核繁忙,您必须启动多个任务。您可以将每个任务分成两部分或N部分。当一部分直接执行时,另一部分将放入等待队列。如果池中的任何其他WorkerThread空闲且没有工作要做,则应将其“窃取”您可以从队列中分叉挂起的任务,并并行执行它们

要使8个内核/WorkerThread忙碌,不必一次调用8个任务。至少分为两个任务就足够了,这两个任务也会再次分叉(递归),直到所有WorkerThread都饱和为止(假设您的整个问题分解为那么多子任务)。 因此,如果您有更多或更少的内核,则无需修改代码,并且您的任务根本不应该担心WorkerThread管理

最后,invokeAll()或join()在所有任务运行后返回