JavaのParallelStreamで最大並列処理数を変更する方法

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

以前、Javaで並列処理を行う方法として ParallelStream を紹介しました。

tech.excite.co.jp

今回は、 ParallelStream で並列処理をする際に、最大並列数を変更する方法を紹介します。

ParallelStreamと並列数

上記の記事で紹介したとおり、 ParallelStream を使うとJavaで並列処理を実装することが出来ます。

ただし、デフォルトの最大並列数は「稼働コンピュータのコア数 - 1」となっているため、例えば「APIにリクエストする」のように、アプリケーションのコンピューティング能力自体はそこまで必要ではなく待機時間が多いような処理のような、もっと並列数を増やしたい場合も出てきます。

そのような時は、 ForkJoinPool を使うと解決できます。

ForkJoinPoolとParallelStream

ForkJoinPool を使うと、複数の処理を並列で実行することが出来ます。

docs.oracle.com

基本的には ForkJoinTask と呼ばれるタスクを並列実行するためのものですが、 ParallelStream で使用することも出来ます。

final ForkJoinPool pool = new ForkJoinPool(100); // 必要な最大並列数を指定

pool.submit(() -> sampleList
        .parallelStream() // pool内で実行することで、poolで指定した最大並列数が適用される
        .forEach(sample -> this.sampleProcess(sample))
).get(); // get() で、すべての並列処理が終了するのを待ち合わせる

pool.shutdown(); // poolを終了する

ParallelStream だけを使うのに比べると少しだけ複雑になりますが、それでもまだ十分にシンプルと言えるレベルでしょう。

最後に

並列処理は、適切な並列数にすることで全体の処理時間が大幅に減る可能性があります。

並列化したい処理を見て、もし最大並列数が多いほうが良いのであれば、是非活用していきましょう。

ちなみに、 ForkJoinPoolForkJoinTask は、名前は似ていますが別物です(Pool は実行環境、 Task は実行するタスクそのもの)。

調べていると少しごっちゃになりやすいので、注意するといいかもしれません。