Javaの並列処理をForkJoinPoolとCallableで試してみる

この記事ではjavaの並列処理としてForkJoinPoolとCallableを試してみます。他にもjavaにはRunnableを使ったものなどありますが、ForkJoinPoolとCallableで十分に足りると思うのでここでは割愛いたします。

ForkJoinPoolを使った並列処理

まずはForkJoinPoolを使った並列処理のやり方は以下です。

listの中に文字列がリスト型で入っておりparallelStreamと組み合わせることでlistから一件ずつ要素取り出し、map内で処理させるところを並列化しています。

ForkJoinPoolの引数にスレッド数としてlist.size()を入れているので、要素の数だけスレッドが立ち上がります。そのことはコンソールログからもわかります。

(parallelStreamだけの並列化だとCPUのコア数分しかスレッドが立たない。)

Main.java

コンソールログ

試しに、ForkJoinPoolのスレッドの数を1としてみると、スレッドが1つしか立ち上がらず、一件ずつ1つのスレッドで処理されることになります。コンソールログからもそのことはわかります。

Callableを使った並列処理

次にCallableを使った並列処理の実装方法は以下です。

こちらもlistの中に文字列がリスト型で入っておりfor文と組み合わせてexecutorService.submit内の処理がされるところを並列化しています。

Executors.newFixedThreadPoolの引数にスレッド数としてlist.size()を入れているので、ループの数だけスレッドが立ち上がります。そのことはコンソールログからもわかります。

Main.java

コンソールログ

試しに、Executors.newFixedThreadPoolのスレッドの数を1としてみると、スレッドが1つしか立ち上がらず、一件ずつ1つのスレッドで処理されることになります。コンソールログからもそのことはわかります。