invokeAll 它究竟是如何工作的?(分叉加入)

Rol*_*all 5 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 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);
Run Code Online (Sandbox Code Playgroud)

我看到invokeAll()自动分叉RecursiveActionTry我传递给的两个对象之一。我的笔记本电脑只有 2 个内核……如果我有 4 个内核并启动了 4 个任务invokeAll(right, left, backward, forward);怎么办……我会使用所有 4 个内核吗?不知道,因为我只有 2 个内核。

我还想知道 invokeAll(right, left) 是否在幕后调用compute()第一个参数(右)和fork + join第二个参数(左)。(如在 RecursiveTask 扩展中应该是)。否则它不会使用并行性,是吗?顺便说一句,如果有超过 2 个参数..它是否调用compute()第一个并在所有其他参数上分叉?

提前致谢。

Mic*_*rry 5

invokeAll()调用许多在不同线程上独立执行的任务。这不需要为每个线程使用不同的内核,但如果每个线程可用,它可以允许为每个线程使用不同的内核。细节由底层机器处理,但本质上(简单地说)如果可用内核少于线程,它会对线程进行时间切片,以便允许一个内核在一个内核上执行一段时间,然后是另一个内核,然后是另一个内核(在一个循环中。)

顺便说一句,如果有超过 2 个参数..它是否在第一个调用 compute() 并在所有其他参数上调用 fork?

它将compute()所有参数,然后compute()如果不满足工人阈值,则方法负责委托和分叉,然后在完成时加入计算。(虽然将它拆分为两种以上的方式是不寻常的 - fork join 通常通过每个递归将工作负载拆分为两个来工作,如果需要的话。)