次のコードを検討してください。他のタイマーイベントがハングした場合、ScheduledThreadPoolExecutorタイマーは起動しません。
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class Test {
private static ScheduledThreadPoolExecutor threadPool = new ScheduledThreadPoolExecutor(0);
public static void onTimer() {
System.out.println("onTimer");
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException ignored) {
}
}
}
public static void onTimer2() {
System.out.println("onTimer2");
}
public static void main(String[] args) {
threadPool.scheduleAtFixedRate(Test::onTimer, 0, 500, TimeUnit.MILLISECONDS);
threadPool.scheduleAtFixedRate(Test::onTimer2, 0, 500, TimeUnit.MILLISECONDS);
}
}
固定レートでスケジュールされた2つのタイマーがあり、最初のタイマーイベントでは、タスクが無期限にハングします。それはそれは望んでいる限り多くのスレッドを作成することが許可されているスレッドプールを使用して作成されているので、最初のタスクがハングアップしていても
は、私は、第二のタイマは特定の速度で発射することを期待しています。
しかし、第二タイマーが発火することはありません。
誰かが理由を説明できますか?
スレッドプールサイズが0であるため、スレッドプールサイズを2以上に増やしてからもう一度試してください。 –
@SangramJadhav 0はスレッドプールの初期サイズです。ドキュメントによれば、プールは必要に応じて拡大することができます。 –
@SangramJadhavはそれについてコメントしようとしていましたが、それは無関係のようです。プールサイズを最初に0に設定して、複数の並行タスクをスケジュールすることができます。 – Mena