私のコードには、ExecutorService
固定スレッド プールで実装されたスレッド プールがあります。プールによって実行されるタスクのほとんどは非常に短いですが、約 20 ~ 30 秒という長時間実行されるタスクが 1 つある場合があります。このタスクを実行すると、新しいタスクは実行されず、長時間実行されているタスクが完了したときにのみ再開されます。
プールは 20 に設定されているため、実行中のスレッドが 2 つだけでこれを再作成できるため、問題はありません。最初は長時間実行され、2 番目はスタックします。
なぜ動かなくなったのか頭を悩ませていたのですが、に切り替えnewFixedThreadPool()
てnewCachedThreadPool()
ボトルネックが解消されました。これが私が行った唯一の変更です。
この動作は理にかなっていますか? コードは正常に動作するように見えるので、変更を維持すると思います。私が理解している限り、多くの短いタスクを実行している場合は、キャッシュ スレッド プールを使用する方が良いと思いますが、なぜ固定プールがハングしてそこにあるのか疑問に思っていました。それを修正する方法は?
また、固定からキャッシュに切り替えた場合、副作用が発生する可能性はありますか?
ありがとう。