1

コードです:なぜプログラムはschedule()が終了するのを待っていますが、scheduleWithFixedDelay()を待っていませんか?ここ

ScheduledExecutorService service = null; 
try { 
    service = Executors.newSingleThreadScheduledExecutor(); 
    Runnable task1 =() -> System.out.println("Executed only once"); 
    Runnable task2 =() -> System.out.println("Executed repeatedly"); 

    service.schedule(task1, 5, TimeUnit.SECONDS); 
    service.scheduleWithFixedDelay(task2, 6, 2, TimeUnit.SECONDS); 
} finally { 
    if (service != null) { 
     service.shutdown(); 
    } 
} 

上記のコードを実行する場合、プログラムが(スケジュールを実行するために、5秒待機)が、その後それはscheduleWithFixedDelay()を実行せずに終了します。

私は、schedule()がscheduleWithFixedDelay()とは異なり、同期して実行されていると考えていますが、ドキュメントでこれを支持する引数が見つかりませんでした。

答えて

2

これは少し微妙ですが、私は答えはdocumentation for shutdownの文言にあると思う:

は以前に提出したタスクが実行される通常のシャットダウンを開始しますが、新しいタスクは受け入れられません。

最初のタスクは「以前に送信されたタスク」とみなされるため、shutdown()は実行を待機します。

技術的には、繰り返しタスクは以前に提出されましたが、それが永久に繰り返されるため、完了を待つことは不可能です。そうしようとするとshutdown()の契約に違反します。だから、私は唯一の選択肢は、将来の繰り返しの仕事の実行を無視することだと言っています。

関連する問題