编程语言
首页 > 编程语言> > java – invokeAll它是如何工作的? (ForkJoin)

java – invokeAll它是如何工作的? (ForkJoin)

作者:互联网

我写了以下代码片段:

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);

我看到invokeAll()自动派生我传递给的两个RecursiveActionTry对象中的一个.我的笔记本电脑只有2个内核..如果我有4个内核并启动4个任务怎么办… invokeAll(右,左,后,前);我会使用所有4个核心吗?不知道因为我只有2个核心.

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

提前致谢.

解决方法:

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

And by the way, if there are more than 2 arguments.. does it call compute() on the first and fork on all the others?

它会计算()所有参数,然后如果不满足工作者阈值,则计算()方法的委托和分叉的责任,然后在copmlete时加入计算. (拆分它超过两种方式是不寻常的 – fork连接通常适用于每次递归,如果需要,将工作负载分成两部分.)

标签:java,recursion,fork-join
来源: https://codeday.me/bug/20190625/1284048.html