1

Voici le code:Pourquoi le programme attend-il que schedule() se termine mais n'attend pas 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(); 
    } 
} 

Lors de l'exécution du code ci-dessus, le programme attend 5 secondes pour exécuter le calendrier() mais après qu'il se termine sans courir le scheduleWithFixedDelay().

Je suppose que la raison est que schedule() est exécuté de manière synchrone contrairement à scheduleWithFixedDelay() mais je n'ai pas trouvé les arguments en faveur de cela dans les docs.

Répondre

2

C'est un peu subtil, mais je pense que la réponse réside dans le libellé de la documentation for shutdown:

lance un arrêt ordonné dans lequel les tâches sont exécutées précédemment soumises, mais aucune nouvelle tâche ne sera acceptée.

Votre première tâche est qualifiée de "tâche soumise précédemment", de sorte que shutdown() attend son exécution. Techniquement, la tâche répétée a déjà été soumise, mais comme elle se répète indéfiniment, l'attente de l'achèvement est impossible. Tenter de le faire violerait le contrat de shutdown(). Donc, je dirais que la seule alternative est d'ignorer les futures exécutions de tâches répétées.