API завершения работы ThreadPoolExecutor doc verbiage "не ждет" - PullRequest
0 голосов
/ 05 октября 2018

В документации для ThreadPoolExector # shutdown сказано:

Этот метод не ожидает завершения выполнения ранее представленных задач

Чтоэто значит?

Потому что я бы сказал, что поставленные в очередь задачи могут не завершиться, но это не то, что происходит;см. пример кода, который вызывает завершение работы до завершения запуска всех отправленных задач:

package example;

import java.util.concurrent.*;

public class ExecutorTest {

    public static void main(String ... args) {
        ExecutorService executorService = Executors.newFixedThreadPool(3);
        for (int i = 0; i < 10; i++) {
            final int count = i;
            executorService.execute(() -> {
                System.out.println("starting " + count);
                try {
                    Thread.sleep(10000L);
                } catch (InterruptedException e) {
                    System.out.println("interrupted " + count);
                }
                System.out.println("ended " + count);
            });
        }
        executorService.shutdown();         
    }    
}

Что печатает:

C:\>java -cp . example.ExecutorTest
starting 0
starting 2
starting 1
ended 2
ended 0
starting 3
starting 4
ended 1
starting 5
ended 3
ended 5
ended 4
starting 7
starting 6
starting 8
ended 7
ended 6
ended 8
starting 9
ended 9

C:\>

В этом примере кажется довольно ясным, что отправленные задачи завершают выполнение,Я запустил это на JDK8 с Oracle и IBM JDK и получил тот же результат.

Так что же пытается сказать эта строка в документации?Или кто-то написал это для shutdownNow и вырезал и вставил его в документацию по непреднамеренному завершению работы?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В документе ThreadPoolExector#shutdown есть еще одно предложение:

Этот метод не ожидает ранее отправленных задач для завершения выполнения, Используйте для этого awaitTermination.

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


И если вам нужно заблокировать поток вызывающего, используйте ThreadPoolExector#awaitTermination(long timeout, TimeUnit unit):

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

0 голосов
/ 05 октября 2018

Полная цитата Javadoc shutdown():

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

Этот метод не ожидает завершения выполнения ранее отправленных задач.Для этого используйте awaitTermination.

Завершение работы исполнителя предотвращает отправку новых задач .

Уже отправленных задач, запущен или все еще ожидает в очереди , завершит ли выполнение.


Если вы не хотите, чтобы задачи из очереди выполнялись, вызовите shutdownNow():

Пытается остановить все активно выполняющиеся задачи, останавливает обработку ожидающих задач и возвращает список задач, ожидающих выполнения.Эти задачи удаляются (удаляются) из очереди задач по возвращении из этого метода.

Этот метод не ожидает активного выполнения задач для завершения.Для этого используйте awaitTermination.

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

Зависит ли уже запущенные задачи, зависитна задачу, как описано в последнем пункте.

...