6

分割を開始する前に、2 つの計算集約的な基本ケース タスクを必要とする再帰的な分割統治アルゴリズムがあります。最初の基本ケースは独立したタスクなので、並行して実行したいと考えています。基本ケースの後、分割は 0 と 1 の間の異なる入力で同じタスクを実行し、出力に基づいて再度分割するかどうかを決定します。再帰を偽装するタスク ラッパー オブジェクトを作成することで、基本的なケースが機能するようになりましたが、次のように、これは面倒なことのように感じます。

public static void doSomething () {
    ForkJoinPool pool = new ForkJoinPool();
    private ArrayList<Object> al = new ArrayList<Object>();
    TaskWrapper tw = new TaskWrapper(true,-1);

    al.addAll(pool.invoke(tw));
}

@SuppressWarnings("serial")
public static class TaskWrapper extends RecursiveTask<ArrayList<Object>> {
    private ArrayList<Object> al = new ArrayList<Object>();
    private boolean arg;
    private double input;
    private Object out;

    TaskWrapper(boolean ar, double in){
        arg = ar;
        input = in;
    }

    @Override
    public ArrayList<Object> compute() {
        if (arg == false) {
            out = new Object(runIntensiveTask(input));
            al.add(out);
        }
        else {
            // Right Base Case
            TaskWrapper right = new TaskWrapper(false, 1);
            right.fork();

            // Left Base Case
            TaskWrapper left = new TaskWrapper(false, 0);
            al.addAll(left.compute());

            // Join with Right result
            al.addAll(right.join());
        }
        return al;
    }
}

同じことを達成するためのより簡単な方法はありますか?

これは私の最初の StackOverflow 投稿です。形式やプロトコルのエラーはご容赦ください。お手伝いありがとう。

4

1 に答える 1