1

Java fork join を使用して再帰的な問題を解決したいのですが、再帰ステップごとに明示的に新しいタスク インスタンスを作成したくありません。その理由は、タスクが多すぎるということはオブジェクトが多すぎるということであり、数分間の処理でメモリがいっぱいになってしまうからです。

Java 6 で次のソリューションを使用していますが、Java 7 のより良い実装はありますか?

final static AtomicInteger max = new AtomicInteger(10);  // max parallel tasks
final static ThreadPoolExecutor executor = new ThreadPoolExecutor(....);

private void submitNewTask() {
    if (max.decrementAndGet()>=0) {
        executor.execute(new Task(....));
        return;
    }
    run();  // avoid creating a new object
}

public void run() {
    ..... process ....
    // do the recursion by calling submitNewTask()
    max.incrementAndGet();
}

同じタスクで関数を再度呼び出すなどのことを試みinvoke()ましたが(もちろん、関連フィールドを更新した後)、うまくいかないようです。

4

1 に答える 1

0

あなたは正しいアプローチをしていないと思います。Fork/Join フレームワークは、(潜在的に) 大量のデータ セットに対して長時間実行されるアルゴリズムを並列に実行し、データをよりRecursiveTask多くのスレッドで実行できるよりも小さな断片 (それ自体) に分割することを目的としています (複数の " cpu" マシン) ワークスティーリング戦略を使用しています。

ARecursiveTaskはすべてのデータをレプリケートする必要はありませんが、(有害なオーバーラップを避けるために) 作業中の部分にインデックスを保持するだけなので、データのオーバーヘッドは最小限に抑えられます (もちろん、everyRecursiveTaskもメモリを消費します)。

アルゴリズム設計では、メモリ占有と実行時間の間にスレッド オフがあることが多いため、FJ フレームワークは、(かなり少ないと思います) メモリ占有を払って実行時間を短縮することを目的としています。実行時間が第一の問題でなければ、FJ は役に立たないと思います。

于 2013-01-27T08:34:29.390 に答える