ドキュメントにScheduledThreadPoolExecutor
は、次のように記載されています-まったく同じ実行時間にスケジュールされたタスクは、送信の先入れ先出し (FIFO) 順序で有効になります。
これは、同時に実行する必要があるタスクが同時に実行されることはないということですか。代わりに、それらは FIFO 順で実行されますか?
それが本当なら、どのクラスを使用すれば、どのクラスがより優れTimer
ており、この FIFO 問題もありませんか?
ドキュメントにScheduledThreadPoolExecutor
は、次のように記載されています-まったく同じ実行時間にスケジュールされたタスクは、送信の先入れ先出し (FIFO) 順序で有効になります。
これは、同時に実行する必要があるタスクが同時に実行されることはないということですか。代わりに、それらは FIFO 順で実行されますか?
それが本当なら、どのクラスを使用すれば、どのクラスがより優れTimer
ており、この FIFO 問題もありませんか?
ScheduledThreadPoolExecutor が機能する方法は、実行するタスクをチェックする単一の「スケジューリング」またはマスター スレッドがあることです。
タスクが見つかった場合は、プールから「ワーカー」スレッドに委任します。
複数のタスクを実行する準備ができている場合、それらは一度に 1 つずつ「開始」されますが、Java の定義に従って、「開始」されると、後続の処理は並行して行われます。
エグゼキューターを介して同時にスケジュールされた 2 つのタスクがある場合、完了する順序は実行ごとに異なる可能性があり、これを処理するためにロック、待機などの特定の制御を設定しない限り、何をいつどのように処理するかを決定するのは、Java のスレッド スケジューリング (Java がコア上のスレッドに時間を割り当てる方法) 次第です。このようなロック、待機などの設定は一見複雑なタスクであり、予期しないデッドロックやライブロックなどにつながる競合状態が発生しやすいことに注意してください...
スレッドプールのサイズによって異なります。午前 0 時に 1000 のタスクを起動するようにスケジュールし、25 のスレッドしかない場合、最初に実行できるのは 25 だけで、残りは利用可能なスレッドを待つ必要があります。ここでの FIFO は、エグゼキュータが実行スレッドにタスクを渡す順序を指します。
ドキュメントはタスクの「有効化」について述べており、スレッドプールエグゼキュータについて話していることに注意してください。:-)
つまり、タスクは指定された時間まで待機し、その後、通常の ThreadPoolExecutor に配置されたかのように扱われます。プールに利用可能なスレッドが十分にある場合、これらのタスクはすべて並行して実行されます。
プール内の使用可能なスレッドよりも多くのタスクがアクティブになっている場合にのみ、一部のタスクは待機する必要があります。