2010-02-16 10 views
9

ho un'operazione pianificata (in esecuzione in esecuzione ritardo fisso), ha iniziato in questo modo:Qual è il modo corretto di riavviare un'attività pianificata di ScheduledExecutorService?

executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

a ogni avvio del ciclo, controllo per un cambiamento in un file di impostazioni, e poi voglio riavviare l'attività . Il file delle impostazioni contiene anche la lunghezza dell'intervallo (numOfSeconds nel codice sopra).

Attualmente, sto usando il seguente codice per riavviare l'attività:

executoreService.shutdownNow(); 
try { 
while(!executoreService.awaitTermination(5, TimeUnit.SECONDS)){ 
    logger.debug("awaiting termintation"); 
} 
} catch (InterruptedException e) { 
logger.debug("interrupted, continuing", e); 
} 
// initialize startup parameters 
init(); 
// start the main scheduled timer 
executoreService.scheduleWithFixedDelay(repeatingThread, 0, numOfSeconds, TimeUnit.SECONDS); 

io non sono sicuro di queste chiamate API. Qual è il modo consigliato di riavviare l'attività (eventualmente con un nuovo ritardo)?

risposta

13

No, non si desidera o è necessario interrompere l'intero servizio solo per modificare un'attività. Utilizzare invece l'oggetto ScheduledFuture che si ottiene dal servizio per annullare l'attività, quindi pianificarne una nuova.

In alternativa, perché non aggiornare semplicemente lo stato in qualsiasi ripetizioneThread è con nuove impostazioni o parametri? non ha nemmeno bisogno di essere riprogrammato, se non hai bisogno di un nuovo ritardo.

+0

È qualcosa da considerare, ma è più semplice implementare qualcosa che copra qualsiasi caso di modifica delle impostazioni. Ad esempio, qualsiasi modifica nel file delle impostazioni * potrebbe * modificare anche il ritardo. Quindi, invece di controllare se il ritardo è stato cambiato e quindi fare una cosa, e se non era poi qualcos'altro, allora preferirei ricominciare da capo. – Ovesh

Problemi correlati