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()
ましたが(もちろん、関連フィールドを更新した後)、うまくいかないようです。