2010-01-23 13 views
8

Sto seguendo un interessante question su così, sull'uso di ScheduledThreadPoolExecutor per alcune attività ripetitive.pianificazione attività eseguibili in java

La pianificazione di questo oggetto restituisce un oggetto ScheduledFuture che è possibile utilizzare per annullare la successiva esecuzione dell'attività.

Una cosa da notare qui è il compito stesso è completamente disaccoppiato dal schedule--

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

dove-

SomeTask task = new SomeTask(); 

Così il compito stesso non è a conoscenza del programma. Si prega di chiarire se esiste un modo per annullare l'attività e creare una nuova pianificazione per sé.

Grazie

+1

btw, si tratta di una pratica generale per upvote almeno la risposta che avete accettato ("questa risposta è utile" è il titolo dell'icona upvote) – Bozho

+0

grazie bozho, noto. – bushman

risposta

7

Non c'è alcun motivo per cui il compito non può fare riferimento alla ScheduledExecutorService e pianificare stesso per eseguire in caso di necessità:

// (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, questo si è rivelato davvero eccezionale - grazie. – bushman

4

Passare il executor al compito, in modo che possa rendere le manipolazioni con esso :

SomeTask task = new SomeTask(executor); 
+0

questo dovrebbe essermi verificato. Grazie bozho – bushman

Problemi correlati