シリーズのPart 1(source)ではfork/joinライブラリの中心概念と、解決しようとしている問題を詳説している。
前進するという、ハードウェアの傾向は明確です。ムーアの法則のより高いクロックレートは実現していないでしょうが、代わりにチップ毎のコア数増加は実現しているでしょう。ユーザー要求のような粒度の粗いタスク境界を使用することにより、1ダースのプロセッサをビジー状態にし続ける様子は想像に難くありませんが、このテクニックは何千個というプロセッサにはスケールしないので、トラフィックが短時間、急激にスケールすることがあっても、最終的にはハードウェア的傾向が勝利を収めるでしょう。多コアの時代に突入すると、よりきめの細かい並行性を見つけ出す必要があり、そうしないと、やるべき仕事はたくさんあっても、プロセッサがアイドル状態を保っているというリスクを冒すことになってしまうでしょう。遅れをとりたくないならば、優勢なハードウェアプラットフォームが移行すると同時に、ソフトウェアプラットフォームも同様に移行させなければなりません。この目的を達するために、Java 7には、特定クラスのより粒度の細かい並行アルゴリズムに相当するフレームワーク、fork-join フレームワークが含まれることになります。
fork/joinには分割統治テクニックが含まれています。問題を1つ選び、連続してより効果的に解決できるような大きさになるまで、その問題を小さなサブ問題に再帰的に分割します。再帰的なステップには、問題を2つ、もしくは3つ以上のサブ問題に分けて、サブ問題を解決するために待ち行列させ(fork ステップ)、サブ問題の結果を待ち(join ステップ)、そして結果を統合することを伴います。記事ではその後、fork/joinを使った併合整列アルゴリズム(source)を紹介している。
このシリーズで扱っている最後の構成要素はParallelArrayクラスである。ParallelArrayは、高度に並行なやり方でデータセットの検索やフィルタリング、変換を実行する汎用APIを提供する、fork/join使用可能なデータ構造である。
Java向けBGGAクロージャ提案(source) に取り組んでいるチームは、クロージャを扱うためにfork/joinフレームワークを改造し、自分たちの提案サイト上に実用実装版(source)を置いている。このDeveloperworks記事シリーズではParallelArrayクラスの使用例2つを紹介している。1つはクロージャ提案つきで、もう1つはクロージャ提案なしの例である。:
現行のJava 7のfork/join提案を使用して、学生グループ内の最大成績平均点(GPA)を検索する例は以下のとおりである。
ParallelArraystudents = new ParallelArray (fjPool, data);
double bestGpa = students.withFilter(isSenior)
.withMapping(selectGpa)
.max();
public class Student {
String name;
int graduationYear;
double gpa;
}
static final Ops.PredicateisSenior = new Ops.Predicate () {
public boolean op(Student s) {
return s.graduationYear == Student.THIS_YEAR;
}
};
static final Ops.ObjectToDoubleselectGpa = new Ops.ObjectToDouble () {
public double op(Student student) {
return student.gpa;
}
};
以下は、同じ例にBGGAクロージャ提案を使った場合である。
double bestGpa = students.withFilter({Student s => (s.graduationYear == THIS_YEAR) })現在のところ、Java 7は2009年始め頃のリリース予定になっている。
.withMapping({ Student s => s.gpa })
.max();
原文はこちらです:http://www.infoq.com/news/2008/03/fork_join