Определение времени выключения ExecutorService - PullRequest
1 голос
/ 22 сентября 2011

У меня есть ExecutorService, который обрабатывает некоторые задачи.Клиентские потоки могут вызывать shutdown() на ExecutorService.Я хочу запустить некоторый код очистки после полного отключения ExecutorService.Существует ли механизм для запуска метода обратного вызова после завершения работы ExecutorService.

ПРИМЕЧАНИЕ:

  1. I невозможно вызов shutdownNow()
  2. Код очистки должен запускаться после того, как shutdown() завершен.
  3. ExecutorService является newCachedThreadPoolExecutor();

Ответы [ 3 ]

2 голосов
/ 22 сентября 2011

Запустите другой поток / управляемый executor-runnable, который проверяет ExecutorService.awaitTermination(...) в операторе try-catch в цикле, пока он не вернет true, затем запустите свой код обработки завершения работы.Цикл необходим, потому что метод может преждевременно возвращаться при прерывании.

Примерно так:

public class ShutdownHandler implements Runnable {

    private final ExecutorService service;

    public ShutdownHandler(final ExecutorService service) {
        this.service = service;
    }

    @Override
    public void run() {
        boolean terminated = false;
        while (!terminated) {
            try {
                terminated = service.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);
            } catch (final InterruptedException ex) {
                // check again until terminated
            }
        }

        // your shutdown handling code here
    }
}
1 голос
/ 22 сентября 2011

Хорошо, если вы вызываете executorService.invokeAll (myListOfCallableTasks) и их executorService.shutDown () поток, вызывающий блокировку до завершения всех задач:

http://download.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html#invokeAll(java.util.Collection)

1 голос
/ 22 сентября 2011

Я бы расширил и переопределил:

public class MyExecutorService extends ThreadPoolExecutor {
    @Override
    public void shutdown() {
        super.shutdown();
        // do what you need to do here
    }
}

Нечто подобное

...