我写了以下代码段:

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()自动 fork 了我传递给的两个RecursiveActionTry对象之一。我的笔记本电脑只有2个核..如果我有4个核并启动了4个任务,该怎么办... invokeAll(right, left, backward, forward);我会使用所有4个核吗?不知道,因为我只有2个核心。

我还想知道是否后台的invokeAll(right,left)为第一个参数(right)调用compute(),为第二个参数(left)调用fork + join。 (就像在RecursiveTask扩展中那样)。否则它将不使用并行性,对吗?
顺便说一句,如果有两个以上的参数..它会在第一个上调用compute()并在所有其他上派生吗?

提前致谢。

最佳答案

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



它将对所有参数进行compute()编码,然后是compute()方法的责任,即在不满足工作人员阈值的情况下委派并进行 fork ,然后在copmlete时加入计算。 (不过,以两种以上的方式进行拆分是不寻常的-fork联接通常通过每次递归来工作,如有必要,将工作量一分为二。)

关于java - invokeAll它是如何工作的? (ForkJoin),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16896095/

10-09 00:39