Domanda

sto seguendo di un interessante su così, sull'utilizzo di ScheduledThreadPoolExecutor per qualche un'attività ricorrente.

Pianificazione questo oggetto restituisce un oggetto ScheduledFuture che si può usare per annullare la successiva esecuzione del compito.

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

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

dove -

SomeTask task = new SomeTask();

Quindi, il compito in sé non è a conoscenza del programma. Si prega di illuminare se c'è un modo per ottenere il compito di cancellare e creare una nuova pianificazione per se stessa.

Grazie

È stato utile?

Soluzione

Non c'è alcun motivo per cui il compito non può fare riferimento alla ScheduledExecutorService e pianificare stesso per eseguire di nuovo se necessario:

// (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);
    }
  }
}

Altri suggerimenti

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

SomeTask task = new SomeTask(executor);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top