Сравнение между закрытием службы исполнителя (в ожидании завершения) и ожиданием отмены отправленных задач (используя будущее отправки) - PullRequest
0 голосов
/ 04 сентября 2018

Таким образом, рекомендуемая самой Oracle рекомендация по отключению ExecutorService будет выглядеть следующим образом:

@PreDestroy
public void cleanUp(){
        executorService.shutdown();

        try {
            if (executorService.awaitTermination(TIMEOUT, TimeUnit.MILLISECONDS)) {
                executorService.shutdownNow();
            }
        } catch (InterruptedException e) {
            executorService.shutdownNow();
        }
}

Это также позаботится об отмене любых незавершенных задач. Мне интересно , когда приведенный выше фрагмент кода предпочтительнее следующего:

private List<Future> tasks = Collections.EMPTY_LIST;

public void doStuff(){
    for (Service service : services) {
            Future<?> future = executorService.submit(()->service.update(args));
            tasks.add(task);
    }
}

@PreDestroy
public void cleanUp() {

    for (Future task : tasks) {
        task.cancel(false);
    }
}

Последнее позволит завершать запущенные задачи, не прерывая их (tasks.cancel(false)). В этом подходе нет времени ожидания, поэтому бесконечный цикл в задаче предотвратит остановку приложения. Кроме того, у нас остается работающая служба исполнителей: но должны ли мы действительно заботиться об этом, если есть уверенность, что никакие другие задачи не могут быть отправлены после завершения отмененных задач?

Меня больше всего интересует то, что считается наилучшей практикой в ​​ситуации, когда кто-то хочет дождаться завершения / завершения задач, прежде чем приступить к фактическому отключению. Почему мы на самом деле заботимся о закрытии самой службы исполнителя?

Имхо, иметь список фьючерсов, который можно было бы отменить при закрытии приложения, - гораздо более чистое решение, поскольку можно было бы выбрать, какие из них следует прервать, а какие ждать до завершения.

Любые более сложные идеи по этому поводу приветствуются.

Все они являются частью bean-компонента Spring, как вы могли бы понять из аннотации @PotsDestroy, использованной для обозначения метода cleanUp в качестве ловушки отключения для очистки задач службы executors.

1 Ответ

0 голосов
/ 04 сентября 2018

В предлагаемом решении ожидание должно вызываться после вызова метода shutdownNow ().

Неиспользуемая служба ExecutorService должна быть закрыта, чтобы разрешить восстановление его ресурсы.

shutdownNow (): -

  • Перевести состояние выполнения в Стоп
  • Прервать работника, если начался
  • Слить очередь - удалить все темы

Future.cancel (false): -

  • Не прерывает выполнение задач
  • Попытка отмены завершится неудачей, если задача уже выполнена, имеет уже был отменен или не может быть отменен для некоторых других причина. Вам может понадобиться дополнительная логика для обработки различных сценарии. ShutdownNow () уже обрабатывает эти сценарии.

Краткое описание и рекомендация: -

  • На самом деле наличие самого объекта List не является потокобезопасным

  • Синглтон-бобы не имеют состояния. Не должно быть поддержание государства на уровне класса. Даже если вы объявите это как прототип, это не рекомендуется поддерживать список (список не является потокобезопасным) фьючерсы.

Внутри себя классы реализации службы-исполнителя, такие как ThreadPoolExecutor, ScheduledThreadPoolExecutor и т. Д., Решают все проблемы безопасности потоков. Он использует BlockingQueue для преодоления проблем безопасности потоков. Кроме того, он обрабатывает исключения и различные состояния соответственно. Вам может понадобиться понять все внутренности (то есть, что происходит под капотом), чтобы найти хорошее индивидуальное решение.

Самый простой и лучший способ - использовать стандартные реализации (ThreadPoolExecutor, ScheduledThreadPoolExecutor и т. Д.) , доступные в реализациях службы executor, чтобы избежать любых неблагоприятных последствий (т. Е. Утечка памяти, проблемы безопасности потоков).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...