私は .Net 開発で並列拡張機能を使用した経験がありますが、使いやすい並列処理ライブラリの恩恵を受ける Java での作業を検討していました。JVM は、並列拡張に匹敵するツールを提供しますか?
4 に答える
java.util.concurrentパッケージに慣れる必要があります。高レベルのライブラリのベースとなる並列プログラミング用のシンプルで堅牢なプリミティブがあります。このようなライブラリの一例は、並列プログラミング用の使いやすいモジュールを備えたFunctional Javaです。
たとえば、Functional Java を使用して記述された正規の MapReduce の例を次に示します。ドキュメントが文字のストリームであると仮定して、ドキュメントのセット内の単語数をカウントします。
public static long countWords(final List<Stream<Character>> documents,
final ParModule m)
{ return m.parFoldMap(documents,
new F<Stream<Character>, Long>()
{ public Long f(final Stream<Character> document)
{ return (long)fromStream(document).words().length(); }},
longAdditionMonoid)
.claim(); }
ParModule をインスタンス化するには、それに並列戦略を与えます。独自の戦略を実装することも、提供されているものを使用することもできます。以下は、16 スレッドの固定プールを使用するものです。
ExecutorService pool = newFixedThreadPool(16);
ParModule m = parModule(executorStrategy(pool));
上記の例では、次のインポートが必要です。
import fj.F;
import fj.data.Stream;
import fj.control.parallel.ParModule;
import static fj.control.parallel.ParModule.parModule;
import static fj.pre.Monoid.longAdditionMonoid;
import static fj.data.LazyString.fromStream;
import static fj.control.parallel.Strategy.executorStrategy;
import static java.util.concurrent.Executors.newFixedThreadPool;
import java.util.concurrent.ExecutorService;
Java 5 以降、 java.util.concurrentパッケージにはいくつかの限定的なサポートがありますが、完全なサポートはJava 7 機能です。
Ateji Parallel エクステンションをぜひ試してみてください。 http://www.ateji.com/multicore/
これは、Java 7 の新しい並行処理クラスを作成した JSR166 ワーキング グループのサイトです。
http://g.oswego.edu/dl/concurrency-interest/
jsr166y (Java 7 の新しい並行処理クラス) と extra166y (何らかの理由で含まれないさまざまなクラス) の 2 つのパッケージがリストされています。
extra166y のクラスの 1 つParallelArray
は非常に便利です。バイナリ検索、マージソートなどを自動的に並列化します。