многопоточное исключение, обрабатывающее свободные ресурсы - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь обработать все исключения, сгенерированные в многопоточной задаче, чтобы устранить утечки памяти, прерывания или исключения выполнения (я не хочу их распространять) и тому подобное. Если я прерываю поток (Thread.currentThread().interrupt()), является ли shutdownNow() избыточным в finally ниже?

ThreadPoolExecutor service = new ThreadPoolExecutor(coreSize, maxSize);

// do stuff

try {               
    List<Future<?>> futures = new ArrayList<Future<?>>();

    for (Item item : items) {
        // processing logic
        Runnable myTask = new MyTask();
        futures.add(service.submit(myTask));
    }

    for (Future<?> f : futures) {
        f.get();
    }
} catch (Exception e) {
    // todo
} finally {
    service.shutdown();
    try {
        service.awaitTermination(duration, TimeUnit.SECONDS);
    } catch (Exception e) {
        // todo
        Thread.currentThread().interrupt();
    } finally {
        if (!service.isTerminated()) {
            service.shutdownNow();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Это избыточно только в том случае, если:

  • Все выполняемые задачи не прерываются.
  • И в очереди блокировки нет кэшированных задач.

Вызов shutdown заставит исполнителя не принимать новые задачи, но задачи, кэшированные в очереди блокировки, будут по-прежнему выполняться.

Вызов shutdownNow будет

  • interrupt все запущенные задачи
  • отменяют все задачи в очереди
0 голосов
/ 26 апреля 2018

shutdownNow будет вести себя так же, как и shutdown, если MyTask игнорирует любые прерывания .В этом случае, да, shutdownNow является избыточным.

С другой стороны, если прерывание может повлиять на a MyTask, то shutdownNow необходимо для остановки рабочих потоков.

...