何千ものタスクをスケジュールできる必要があるサーバーを設計しています。タスクは 5 秒ごとに実行されます。スケジュールされたエグゼキュータ サービスは、何千ものタスクを正確に処理できますか? 1つのスレッドだけでタイミングを計ろうとしています。ただし、実際のタスクはスレッド プールで実行されます。ありがとう
それがどのように機能するのか正確にはわからないので、誰かがそれを明確にすることができれば幸いです!
何千ものタスクをスケジュールできる必要があるサーバーを設計しています。タスクは 5 秒ごとに実行されます。スケジュールされたエグゼキュータ サービスは、何千ものタスクを正確に処理できますか? 1つのスレッドだけでタイミングを計ろうとしています。ただし、実際のタスクはスレッド プールで実行されます。ありがとう
それがどのように機能するのか正確にはわからないので、誰かがそれを明確にすることができれば幸いです!
ScheduledExecutorService
スレッドプールによって支えられています。大まかに言えば、次の式を使用して、遅延なしでタスクを同時に実行するために必要なスレッドの数を計算できます。
プール内のスレッドの最小数は、1秒あたりに実行されるタスクの平均数に平均タスク実行時間を掛けたものに等しくなります
たとえば、平均して2つのタスクを開始して終了するのに3秒(平均)かかる場合、6つのスレッドが必要です。もちろん、これは、時間の経過とともにタスクがかなり均一に分散されることを前提としています。
Executors.newCachedThreadPool()
理論的には無限の数のタスクを同時に実行できるものを使用することもできます。明らかに利用可能なメモリとコンテキストスイッチの数により、この数は大幅に減少します。
使用シナリオが次の場合:5秒ごとにまったく同じ時点で数千のタスクスケジュールを実行します。JVMも他のプラットフォームもそれを処理しません。数千のスレッドがある場合でも、CPUコアの数によって制限されます。精度は、タスクの性質に大きく依存します(CPUを集中的に使用しますか?I / Oをブロックしますか?)
スケジューラ エグゼキュータ サービスの javadocs を読むことをお勧めします。インダストリアルな強さを疑うポイントはありますか?それを使用してパフォーマンスを測定し、ユースケースに適合するかどうかを確認する必要があります。
また、強い理由がない限り、ライブラリ クラスの実装をいじるべきではありません (クライアント側でスケジューリングとタスク実行スレッドを分離する)。
ただし、スケジューリング基準が複雑になることが予想される場合は、Quartz などのライブラリを使用して評価する必要があります。