Метод shutdownNow
Метод shutdownNow принадлежит интерфейсу ExecutorService и запускает немедленное завершение работы пула потоков. В отличие от метода shutdown, который позволяет уже запущенным задачам завершиться, метод shutdownNow пытается прервать выполняющиеся задачи и больше не принимает новые. Параметров метод не принимает. Он возвращает список List<Runnable>, в который попадают задачи, ожидавшие выполнения в очереди и так и не стартовавшие. Если очередь пуста, возвращается пустой список.
Синтаксис
executor.shutdownNow()
Пример
Давайте создадим пул из одного потока, отправим в него длинную задачу и сразу вызовем shutdownNow. В консоль выведем список невыполненных задач и признак завершения пула:
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.execute(() -> {
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
System.out.println("task was interrupted");
}
});
executor.execute(() -> System.out.println("second task"));
executor.execute(() -> System.out.println("third task"));
List<Runnable> res = executor.shutdownNow();
System.out.println("not started: " + res.size());
System.out.println("isShutdown: " + executor.isShutdown());
}
}
Результат выполнения кода:
"task was interrupted"
"not started: 2"
"isShutdown: true"
Пример
Давайте отправим в пул несколько коротких задач через submit, затем вызовем shutdownNow и проверим, что повторный вызов уже завершённого пула возвращает пустой список:
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
ExecutorService executor = Executors.newFixedThreadPool(2);
for (int i = 1; i <= 5; i++)
{
final int n = i;
executor.submit(() -> System.out.println("task " + n));
}
Thread.sleep(100);
List<Runnable> res = executor.shutdownNow();
System.out.println("pending: " + res.size());
List<Runnable> res2 = executor.shutdownNow();
System.out.println("second call: " + res2.size());
}
}
Результат выполнения кода:
"task 1"
"task 2"
"task 3"
"task 4"
"task 5"
"pending: 0"
"second call: 0"
Смотрите также
-
метод
shutdown,
который запускает плавное завершение пула -
метод
awaitTermination,
который ожидает завершения всех задач -
метод
isTerminated,
который проверяет полное завершение пула -
интерфейс
ExecutorService,
который управляет пулом потоков