Метод awaitTermination
Метод awaitTermination класса ExecutorService
ожидает завершения выполнения всех задач после
вызова shutdown или shutdownNow.
В первый параметр мы передаем время ожидания,
во второй - единицу измерения этого времени
(например, TimeUnit.SECONDS). Метод
блокирует текущий поток до тех пор, пока пул
не перейдет в состояние завершения, либо пока
не истечет указанное время. Если пул завершился -
возвращается true, если время истекло -
false.
Синтаксис
executor.awaitTermination(timeout, unit)
Пример
Давайте создадим пул из двух потоков, отправим
в него несколько задач, вызовем shutdown
и дождемся завершения всех задач с помощью
awaitTermination:
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);
executor.submit(() -> System.out.println("task 1"));
executor.submit(() -> System.out.println("task 2"));
executor.submit(() -> System.out.println("task 3"));
executor.shutdown();
boolean res = executor.awaitTermination(5, TimeUnit.SECONDS);
System.out.println(res);
}
}
Результат выполнения кода:
task 1
task 2
task 3
true
Пример
Давайте проверим, что вернет метод, если время
ожидания истекло раньше, чем завершились задачи.
Установим таймаут в 1 миллисекунду,
а задача будет спать 2 секунды:
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.newSingleThreadExecutor();
executor.submit(() -> {
try
{
Thread.sleep(2000);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
System.out.println("task done");
});
executor.shutdown();
boolean res = executor.awaitTermination(1, TimeUnit.MILLISECONDS);
System.out.println(res);
}
}
Результат выполнения кода:
false
Пример
Давайте используем awaitTermination в цикле,
чтобы дождаться завершения задач без ограничения
по общему времени:
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);
executor.submit(() -> System.out.println("task 1"));
executor.submit(() -> System.out.println("task 2"));
executor.shutdown();
while (!executor.awaitTermination(1, TimeUnit.SECONDS))
{
System.out.println("waiting...");
}
System.out.println("all tasks finished");
}
}
Результат выполнения кода:
task 1
task 2
all tasks finished
Смотрите также
-
метод
shutdown,
который запускает плавное выключение пула -
метод
shutdownNow,
который немедленно останавливает пул -
метод
isTerminated,
который проверяет завершение пула -
метод
submit,
который отправляет задачу в пул