0

4つのCPUを持つマシンでスレッドプールが実行されていて、このプールに負荷動的制御を実行したいとします。プール内でスレッドが実行されているときにcorePoolSizeを変更することは可能でしょうか?つまり、負荷が低い場合は、最大で2つのスレッドを同時に実行できますが、負荷が高い場合は4つのスレッドが許可されます。そうでない場合は、適切な解決策はありますか?ThreadPoolExecutorのcorePoolSizeを動的に変更する

+1

"最も一般的には、コアおよび最大プールサイズは構築時にのみ設定されますが、setCorePoolSize(int)およびsetMaximumPoolSize(int)を使用して動的に変更することもできます。 https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html – Fildor

+0

高負荷/低負荷をどのように検出する予定ですか? – Fildor

+0

Re、 "そうでなければ、適切な解決策はありますか?"最悪の場合は、独自のスレッドプールを実装できません。 –

答えて

1

プールにスレッドがいくつか存在する場合、corePoolSizeを変更できますか?

確かに。 corePoolSizevolatileThreadPoolExecutorとマークされていますので、いつでもお使いのマシンの負荷に基づいてtpe.setCorePoolSize(...)と電話することができます。プールに仕事を出して寝ることも、負荷をチェックしたり、コアプールのサイズを調整したりすることもできます。これを行うには、コアサイズに別のスレッドを追加したいと思うでしょう。

つまり、負荷が低い場合、最大で2つのスレッドを同時に実行できますが、負荷が高い場合は4つのスレッドが許可されます。

それだけの時間が、これは実際にあなたがスレッドプールに送信されたジョブが完全にCPUがバインドされている場合には意味があるになるだろうことに注意することが重要であるが、これは罰金聞こえます。すべてのIO(ディスク、ネットワークなど)は、並行性を低下させることはあまり意味がないことを意味します。

これは私がスレッドアプリケーションの大部分を書いたが、私はこれをやらなければならなかったとは思わなかった。

関連する問題