2010-11-17 14 views
11

Sto usando ScheduledExecutorService e, dopo aver chiamato il metodo shutdown, non riesco a pianificare un Runnable su di esso. Chiamando il numero scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) dopo il shutdown() si lancia java.util.concurrent.RejectedExecutionException. C'è un altro modo per eseguire una nuova attività dopo che shutdown() viene chiamato su ScheduledExecutorService?ScheduledExecutorService start stop più volte

+1

Questo è il comportamento previsto. Potresti spiegare cosa stai cercando di fare e perché vuoi eseguire un altro eseguibile dopo l'arresto? – Jeremy

risposta

35

È possibile riutilizzare lo scheduler, ma non arrestarlo. Piuttosto, annulla il thread in esecuzione che puoi ottenere quando invochi il metodo scheduleAtFixedRate. Es:

//get reference to the future 
Future<?> future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//cancel instead of shutdown 
future.cancel(true); 
//schedule again (reuse) 
future = service.scheduleAtFixedRate(runnable, INITIAL_DELAY, INTERVAL, TimeUnit.SECONDS) 
//shutdown when you don't need to reuse the service anymore 
service.shutdown() 
+1

Sono stato in grado di chiudere e creare nuovi servizi in un ambiente Spring, ma i bean mi stavano dando dolore. Questo ha fatto il trucco, grazie! –

+0

@Alex Il primo oggetto futuro non verrà rilasciato fino a quando il servizio non verrà arrestato. Sarà una perdita di memoria quando il servizio durerà a lungo e programmerà molte volte. Se è vero, c'è un modo per evitare perdite di memoria? – Nickolas

+0

Ho sbagliato, il futureTask annullato non verrà aggiunto a workQueue, quindi verrà rilasciato da GC. – Nickolas

5

Le javadocs di shutdown() dicono:

Initiates an orderly shutdown in which previously submitted tasks are executed, 
but no new tasks will be accepted. 

Quindi, non si può chiamare shutdow() e quindi pianificare nuovi compiti.

+0

Qualche suggerimento su come riprogrammare le nuove attività dopo l'arresto? – walters

+0

Creare un nuovo ScheduledExecutorService o non arrestare quello esistente. C'è un motivo per cui lo stai chiudendo? –

2

Non è possibile fare in modo che l'esecutore accetti nuove attività dopo averlo spento. La domanda più pertinente è il motivo per cui è necessario spegnerlo in primo luogo? Gli esecutori creati devono essere riutilizzati per tutta la durata della tua applicazione o sottosistema.