フォークジョインの仕組みの詳細を理解しようとしています。フォークジョイン:すべてのサブタスクをフォークするか、現在のスレッドに1つ残す
ウィキペディアには、左半分がフォークされ、右半分が現在のスレッドによって処理されるmerge-sortの例があります。
mergesort(A, lo, hi):
if lo < hi: // at least one element of input
mid = ⌊(hi - lo)/2⌋
fork mergesort(A, lo, mid) // process (potentially) in parallel with main task
mergesort(A, mid, hi) // main task handles second recursion
join
merge(A, lo, mid, hi)
私はすべてのサブタスクフォークを見て、その結果を待つましたが、ほとんどのJavaの例:スレッドではなく、有益な何かをするので、
for (Document document : folder.getDocuments()) {
DocumentSearchTask task = new DocumentSearchTask(document, searchedWord);
forks.add(task);
task.fork();
}
for (RecursiveTask<Long> task : forks) {
count = count + task.join();
}
return count;
は、ウィキペディアの例は、私に多くの意味がありますサブタスクをブロックして待機しています。
一方、すべてのタスクをフォークすると、再帰を回避してStackOverflowError
を取得できません。
タスクを分割する好ましい方法とその理由は何ですか?
あなたのご質問は何ですか? –
更新、ありがとうございました – damluar