2017-08-01 3 views
1

J'ai un ScheduledExecutorService que j'utilise pour exécuter une méthode updateIndex() toutes les minutes. Toutefois, si des modifications sont apportées aux ressources pendant la minute qui s'écoule entre la dernière actualisation et la prochaine actualisation, je souhaite que updateIndex() soit immédiatement appelé, puis que le service d'exécution reprenne son emploi du temps normal; c'est-à-dire que la prochaine mise à jour aura lieu dans une minute. Cependant, je n'ai rien vu dans la documentation pour suggérer qu'il existe la capacité de le faire. Des idées?Comment interrompre un ScheduledExecutorService

Répondre

1
public static void updateIndex() { 
     Runnable runnable =() -> { 
      //Do your logic here 
     }; 
     ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); 
     service.scheduleAtFixedRate(runnable, 0, 1, TimeUnit.MINUTES); 
     } 

Selon JavaDocs

java.util.concurrent.ScheduledExecutorService.scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 

crée et exécute une action périodique qui devient actif en premier après le délai initial donné, et ensuite avec la période donnée; c'est-à-dire que les exécutions vont commencer après initialDelay puis initialDelay + period, puis initialDelay + 2 * period, et ainsi de suite. Si une exécution de la tâche rencontre une exception, les exécutions suivantes sont supprimées. Sinon, la tâche ne prendra fin que par l'annulation ou la résiliation de l'exécuteur. Si l'exécution de cette tâche prend plus de temps que sa période, alors les exécutions suivantes peuvent commencer en retard, mais ne seront pas exécutées simultanément.

+0

Il n'est donc pas possible "d'interrompre" l'exécuteur avec la période d'attente entre les exécutions de la commande Runnable? – fojalar

+0

Vous pouvez interrompre le runnable en utilisant scheduledExecuter –

+0

ScheduledFuture planificateur = scheduledExecutor \t \t \t \t .schedule (() -> yourlogicmethod(); \t \t DateTime currentTime = new DateTime(); \t \t currentTime = currentTime.plus (scheduler.getDelay (TimeUnit.MILLISECONDS)); –

0

scheduleAtFixedRate() renvoie ScheduledFuture qui correspond à la méthode que vous recherchez.