ScheduledExecutorService: когда должно быть запущено завершение работы? - PullRequest
12 голосов
/ 29 марта 2012

Я использую ScheduledExecutorService в моем приложении.Мне нужно время от времени использовать его в определенном классе Utility для запуска запланированных потоков.

Это хороший дизайн для хранения ScheduledExecutorService в статическом поле?Это необходимо для вызова ScheduledExecutorService.shutdown () в таком случае?Какой риск, если я не вызову выключение?

Вот что я хотел сделать:

private static ScheduledExecutorService exec = Executors.newScheduledThreadPool(5);

public void scheduleTask(String name) {
        Future<?> future = futuresMapping.get(name);
        if(future!=null && !future.isDone())
            future.cancel(true);

        //execute once   
        Future<?> f = scheduledExecutor.schedule(new MyTask()), 1, TimeUnit.MINUTES);
        futuresMapping.put(name, f);
}

Спасибо

Ответы [ 2 ]

6 голосов
/ 29 марта 2012

Вы всегда должны вызывать shutdown () или shutdownNow (). Если вы этого не сделаете, ваше приложение может никогда не завершиться, поскольку все еще существуют активные потоки (в зависимости от того, как вы завершаете свое приложение, независимо от того, находится оно в управляемой среде или нет и т. Д.).

Обычно вы вызываете shutdown () из какого-либо метода события жизненного цикла, например из Spring DisposableBean.destroy (), или если вы не используете какую-либо инфраструктуру, просто вызовите ее перед выходом из приложения.

3 голосов
/ 29 марта 2012

Effective Java 2nd Ed говорит:

И вот как сказать исполнителю, чтобы он завершил грациозно (если вы не сделаете этого, вероятно, ваша виртуальная машина не выйдет):

executor.shutdown();

...