РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1055 of 1163 menu

Метод 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,
    который отправляет задачу в пул
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить