独自スレッドプールでParallelStreamを使ってみたJavaParallelStreamでI/O待ち状態を作るとプール内のスレッドを食いつぶす?ParallelStreamはアプリ全体で共通で持っているスレッドプールを使う上、CPUのコア数分しかスレッドが無いのでI/O待ちが発生するようなものには使ってはいけない、という話を聞きました。?ということで検証してみました。VMでみてみたところ。...という、アプリ内での共通スレッドプールが、ParallelStreamで使われています。4コアCPUで実験しているため、プール内のスレッドは3つ。(それに加えて呼び出し元のスレッドがあるので、JVM全体で可動しているスレッドは4つ)。4個通信というように、外部通信が4件ずつしか行われません。Pool内のスレッド取得合戦が起こってしまうことも確認できました。Poolのスレッド数を設定で増やすことも可能なようですが、「スレッド取得合戦」を避けるため、独自のスレッドを作ってParallelStreamを回すことを検討してみます。streamを回します。するとスレッド数の上限が10になったので、10並列で通信を実行。一気に10回分のサービス呼び出しが終了。Poolを使用)を実行してもスレッド取得が競合しないという結果が得られました。メソッド実行のたびにスレッドが増えていきます。大丈夫なんでしょうか。これ、本番可動させてたら無尽蔵にスレッドが増え、一定期間経つとアラートが飛んできて、再起動を余儀なくさせられるんじゃないでしょうか。過去の悪夢が蘇ってきます。...ということで軽くロングランテストを実施。3時間位流し続けてみた限りでは、GCのタイミングで古いスレッドは消えていっており、特にスレッドが溢れたりメモリリークしたりしている様子はありませんでした。49652番目のスレッドプール。これより以前に作成されたものは消えている。都度スレッドを作成して破棄するのは、CPUとメモリの無駄遣いっぽい雰囲気がします。専用の「スレッドプール」を作るということで、以下のように(シングルトンの)インスタンス変数としてスレッドプールを定義してみました。}}いい感じでスレッドの使い回しができているようです。読者になる検索リンクはてなブログブログをはじめる週刊はてなブログはてなブログPro最新記事awkで特定の列を除外して出力するWindows10にOracleをインストールしようとしたらありがちな罠にハマった古いプログラムからも学ぶことがある...と思う。#rtechconf月別アーカイブ参加グループプログラミングインターネットテクノロジーはてなブログをはじめよう!taichiwさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。