2010-01-23 9 views
8

Je suis suivi d'un intéressant question de sorte, sur l'utilisation de ScheduledThreadPoolExecutor pour certaines tâches répétées.planification des tâches exécutables en java

La planification de cet objet renvoie un objet ScheduledFuture que vous pouvez utiliser pour annuler l'exécution suivante de la tâche.

Une chose à noter ici est la tâche elle-même est complètement découplé du schedule--

ScheduledExecutorService executor = new ScheduledThreadPoolExecutor(1); 
ScheduledFuture nextSchedule = 
    executor.schedule(task, 60000, TimeUnit.MILLISECONDS); 

where-

SomeTask task = new SomeTask(); 

La tâche elle-même pas au courant de l'annexe. S'il vous plaît éclairer s'il y a un moyen d'obtenir la tâche d'annuler et de créer un nouveau calendrier pour lui-même.

Merci

+1

btw, c'est une pratique courante d'upvote au moins la réponse que vous avez acceptée ("cette réponse est utile" est le titre de l'icône de vote up) – Bozho

+0

merci Bozho, noté. – bushman

Répondre

7

Il n'y a aucune raison pour laquelle la tâche ne peut pas faire référence à la ScheduledExecutorService et se programmer pour exécuter à nouveau si nécessaire:

// (Need to make variable final *if* it is a local (method) variable.) 
final ScheduledExecutorService execService = Executors.newSingleThreadScheduledExecutor(); 

// Create re-usable Callable. In cases where the Callable has state 
// we may need to create a new instance each time depending on requirements. 
Callable<Void> task = new Callable() { 
    public Void call() { 
    try { 
     doSomeProcessing(); 
    } finally { 
     // Schedule same task to run again (even if processing fails). 
     execService.schedule(this, 1, TimeUnit.SECONDS); 
    } 
    } 
} 
+0

@adamski, cela s'est avéré être vraiment génial - merci. – bushman

4

passer le executor à la tâche, afin qu'il puisse faire des manipulations avec elle :

SomeTask task = new SomeTask(executor); 
+0

cela aurait dû m'être venu à l'esprit. Merci bozho – bushman

Questions connexes