Метод shutdown
Метод shutdown класса ExecutorService запускает
упорядоченное завершение работы пула потоков. После вызова
этого метода пул перестает принимать новые задачи, но уже
запущенные задачи продолжают выполняться до своего завершения.
Метод не принимает параметров и не возвращает результата.
Важно понимать, что shutdown не блокирует текущий поток -
он лишь сигнализирует пулу о необходимости завершиться.
Чтобы дождаться фактического завершения всех задач, после
вызова shutdown обычно вызывают метод
awaitTermination. Если нужно немедленно прервать
выполняющиеся задачи, используют shutdownNow.
Синтаксис
executor.shutdown()
Пример
Давайте создадим пул из двух потоков, отправим в него несколько
задач, а затем вызовем shutdown и дождемся завершения
всех задач:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 1; i <= 3; i++)
{
final int taskId = i;
executor.execute(() -> {
System.out.println("Task " + taskId + " started");
try
{
Thread.sleep(500);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
System.out.println("Task " + taskId + " finished");
});
}
executor.shutdown();
executor.awaitTermination(5, TimeUnit.SECONDS);
System.out.println("Executor is terminated: " + executor.isTerminated());
}
}
Результат выполнения кода:
Task 1 started
Task 2 started
Task 1 finished
Task 2 finished
Task 3 started
Task 3 finished
Executor is terminated: true
Пример
Давайте проверим, что после вызова shutdown пул
больше не принимает новые задачи:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.RejectedExecutionException;
public class Main
{
public static void main(String[] args)
{
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> System.out.println("First task"));
executor.shutdown();
try
{
executor.execute(() -> System.out.println("Second task"));
}
catch (RejectedExecutionException e)
{
System.out.println("New task rejected: " + e.getClass().getSimpleName());
}
System.out.println("isShutdown: " + executor.isShutdown());
}
}
Результат выполнения кода:
First task
New task rejected: RejectedExecutionException
isShutdown: true
Смотрите также
-
класс
ExecutorService,
который управляет пулом потоков -
метод
shutdownNow,
который немедленно прерывает выполнение задач -
метод
awaitTermination,
который ожидает завершения всех задач -
метод
isTerminated,
который проверяет, завершился ли пул полностью