1

インターネットから既存のコードをダウンロードしました。少し変更して実行しました。あるシナリオでは、探していたものが得られませんでした。ここにコードがあります -

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ForkJoinPool;
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(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 work myself1 " + this.workload);
            try {
                Thread.sleep(1000L);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("Done it ya " + this.workload);
        }

    }

    private List<MyRecursiveAction> createSubtasks() {
        List<MyRecursiveAction> subTasks = new ArrayList<>();
        MyRecursiveAction subtask1 = new MyRecursiveAction(this.workload / 2);
        MyRecursiveAction subtask2 = new MyRecursiveAction(this.workload / 2);
        subTasks.add(subtask1);
        subTasks.add(subtask2);
        return subTasks;
    }

    public static void main(String[] args) {
        MyRecursiveAction myRecursiveAction = new MyRecursiveAction(24);
        ForkJoinPool forkJoinPool = new ForkJoinPool(4);
        forkJoinPool.invoke(myRecursiveAction);
    }

}

次の抜粋を確認してください -

        System.out.println("Doing work myself1 " + this.workload);
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println("Done it ya " + this.workload);

1 秒のスリープを追加してから、別のステートメントを出力しました。ただし、コードを実行すると、そのステートメントが出力されません。理由がわかりません。それが印刷されないのはなぜですか?実際、実行の結果は -

Splitting workload :: 24
Doing work myself1 12
Doing work myself1 12

次の行も期待していました-「やったね」..

4

2 に答える 2