Je ne fais qu'explorer la méthode scheduleAtFixedRate de la classe ScheduledExecutorService en Java.
Voici mon code suspect :
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
Runnable command = () -> {
System.out.println("Yo");
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
};
scheduledExecutorService.scheduleAtFixedRate(command, 0, 1, TimeUnit.SECONDS);
Je m'attendais à ce que, toutes les 1 seconde, scheduledExecutorService essaie de prendre un nouveau thread dans le pool et de le démarrer.
L'API dit : "scheduledExecutorService crée et exécute une action périodique qui devient active d'abord après le délai initial donné, et ensuite avec la période donnée. /(supprimé sans importance)/ Si une exécution de cette tâche prend plus de temps que sa période, les exécutions suivantes peuvent commencer en retard, mais ne s'exécuteront pas simultanément."
Résultat : chaque nouveau fil de discussion démarre toutes les 4 secondes.
Donc, les questions :
-
Quel est le piège - Thread.sleep() arrête-t-il tous les threads ou la nuance dans ce comportement - "Si une exécution de cette tâche prend plus de temps que sa période, les exécutions suivantes peuvent commencer en retard, mais ne s'exécuteront pas simultanément" ?
-
Si "ne s'exécutera pas simultanément" est vrai dans cette situation - pourquoi avons-nous besoin de ce pool de plusieurs threads si chaque thread démarre après l'exécution du thread précédent ?
-
Existe-t-il un exemple simple et valide d'utilisation de scheduleAtFixedRate, où un thread démarre alors que le précédent est toujours en cours d'exécution ?