Когда вызывается метод compute() при использовании RecursiveAction/RecursiveTask

Я нашел следующий фрагмент кода для RecursiveAction онлайн, и мне было интересно, когда compute() вызывается.

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.RecursiveAction;

public class MyRecursiveAction extends RecursiveAction {

private long workLoad = 0;

public MyRecursiveAction(long workLoad) {
    this.workLoad = workLoad;
}

@Override
protected void compute() {

    //if work is above threshold, break tasks up into smaller tasks
    if(this.workLoad > 16) {
        System.out.println("Splitting workLoad : " + this.workLoad);

        List<MyRecursiveAction> subtasks =
            new ArrayList<MyRecursiveAction>();

        subtasks.addAll(createSubtasks());

        for(RecursiveAction subtask : subtasks){
            subtask.fork();
        }

    } else {
        System.out.println("Doing workLoad myself: " + this.workLoad);
    }
}

private List<MyRecursiveAction> createSubtasks() {
    List<MyRecursiveAction> subtasks =
        new ArrayList<MyRecursiveAction>();

    MyRecursiveAction subtask1 = new MyRecursiveAction(this.workLoad / 2);
    MyRecursiveAction subtask2 = new MyRecursiveAction(this.workLoad / 2);

    subtasks.add(subtask1);
    subtasks.add(subtask2);

    return subtasks;
}

}

Есть ли compute() меня вызывают, когда я создаю экземпляр MyRecursiveAction в createSubtasks метод или когда subtask.fork() вызывается?

Начать MyRecursiveAction в новой теме я делаю это так,

MyRecursiveAction myRecursiveAction = new MyRecursiveAction(24);
forkJoinPool.invoke(myRecursiveAction);

который должен вызывать метод 'compute()', я прав?

Надеюсь, кто-то может объяснить мне, как это работает.

0 ответов

Другие вопросы по тегам