さわらブログ

さわら(@xhiroga)の技術ブログ

Javaのマルチスレッド処理を比較!ExecutorServiceとForkJoinPoolで計測した

今度のJJUG ナイトセミナーで人生初LTするのでその準備をしている〜!
現場でマルチスレッド処理を書いたので、その時のフレームワーク選定の話にしようかと。

概要

Javaでマルチスレッド処理をするためには何通りがやり方があるんだけど、自分の仮説ではこう使い分ける!
- トランザクションとか複数裏で走らせたい → ExecutorServiceにRunnableやCallableインスタンスを渡す。
- 再帰的に処理したい → ForkJoinPoolにRecursiveTaskを渡す。

スタックオーバーフローも見た。
stackoverflow.com

でもこれって本当なの?ということで計測した。そしたら新たな疑問が出てきた(後述)

計測

マルチスレッドが必要なので、AWS上にcloud9でvCPU=4の実行環境を用意。
ローカル機だと他にも起動しているアプリが多すぎて計測に向かないかなーと思ったので...

f:id:hiroga_cc:20171223160048p:plain
cloud9は便利だった!
関係ないけどcloud9のjavaのバージョン7だったんですがそれは

計測する処理は次の二つ!
1. フィボナッチ数列の任意の項を求める!nが2よりも大きかったらn-1とn-2の合計として求めることで、再帰的にする。
2. 任意の文字数のファイルを作ってみる!

結果がこちら。めっちゃ適当だって?すまんね。
f:id:hiroga_cc:20171223161206p:plain

でもこの計測結果も今ひとつ信じられない。なぜなら...
- 今回はSystem.nanoTime()で測ったけど、ファイル作成はなぜか計測後もなかなかJavaプロセスが終わらなかった→ロジック変だった?
- ファイル作成の速度が文字数に全然依存していないようにみえる?

結論

再帰的な処理についてはForkJoinPoolに対してRecursiveTaskでよくて、それ以外の処理はどっちでも変わらない...?
そんなわけあるのかしら。どっちでも変わらないならExecutorServiceをそのまま使った方がいいのかな?

ともあれおしまい。LTが楽しみ!