Javaで、ParallelStreamを使って並列処理を行う方法

こんにちは。 エキサイト株式会社の三浦です。

Javaでコードを書く場合、基本的に処理は逐次的に行われます。

ただ、逐次処理でやっていると時間がかかりすぎてしまうため、並列で処理を行いたい場合もあります。

今回は、ParallelStreamを使った並列処理の方法を紹介します。

逐次処理と並列処理

通常Javaでコードを書くと、逐次処理になります。

逐次処理とは、例えば「 A B C 」の3つの処理があったとき、

  1. A の処理を実行
  2. A の処理が終わったら、 B の処理を実行
  3. B の処理が終わったら、 C の処理を実行

という流れの処理のことです。

B を実行するために A の処理が終わっていることが必要だったり、 C を実行するために AB の処理が終わっている必要がある場合などは、必然的にこの処理となります。

一方で、 A B C の3つの処理が完全に独立している、すなわち例えば B を実行するために A が終わっている必要はなく、また C を実行するために AB の処理が終わっている必要はない、というような状況であれば、並列処理が使えます。

並列処理は、

  1. ABC の処理を同時に開始する

という処理のことで、処理の内容にもよりますが、並列で実行することで全体の処理時間が短縮される可能性があります。

Javaではいくつか並列処理を実行する方法がありますが、今回は ParallelStream を使う方法を紹介します。

ParallelStreamの使用方法

ParallelStream の使用方法は非常に簡単です。

例えば、以下のような Stream の処理があるとします。

sampleModelList // サンプルモデルのリスト
    .stream()  // リストをStream化
    .forEach(sampleModel -> doSomething(sampleModel)); // 各サンプルリストに対し、 doSomething メソッドを実行する

これは、逐次処理にて sampleModelList の各要素に doSomething を実行していく、というものになります。

これを並列処理するためには、以下のように変更します。

sampleModelList
    .parallelStream()  // リストを並列実行用にStream化
    .forEach(sampleModel -> doSomething(sampleModel));

これだけで、並列で doSomething を実行できるようになりました。

最後に

Javaでは、もともとStreamを使っているのであれば、非常に簡単に並列処理ができるようになります。

並列処理が有効な場面があるのであれば、少し試してみるのもいいかもしれません!

なお、この時の最大並列数は「稼働コンピュータのコア数 - 1」となります。

並列数の変更方法については、また別の機会に紹介します!