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
risposta
È 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()
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! –
@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
Ho sbagliato, il futureTask annullato non verrà aggiunto a workQueue, quindi verrà rilasciato da GC. – Nickolas
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.
Qualche suggerimento su come riprogrammare le nuove attività dopo l'arresto? – walters
Creare un nuovo ScheduledExecutorService o non arrestare quello esistente. C'è un motivo per cui lo stai chiudendo? –
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.
Questo è il comportamento previsto. Potresti spiegare cosa stai cercando di fare e perché vuoi eseguire un altro eseguibile dopo l'arresto? – Jeremy