Метод await
Метод await класса CountDownLatch блокирует
текущий поток до тех пор, пока счетчик защелки не достигнет
нуля. Если счетчик уже равен нулю, метод возвращается
немедленно. Метод не принимает параметров и возвращает
void. Если поток был прерван во время ожидания,
метод выбрасывает исключение InterruptedException.
Существует также перегруженная версия метода, которая
принимает первым параметром время ожидания, а вторым -
единицу измерения времени. В этом случае метод возвращает
boolean: true, если счетчик достиг нуля,
и false, если время ожидания истекло.
Синтаксис
latch.await()
latch.await(timeout, unit)
Пример
Давайте создадим защелку с счетчиком 3 и запустим
три потока, каждый из которых уменьшает счетчик. Главный
поток будет ждать, пока все три потока завершат работу:
import java.util.concurrent.CountDownLatch;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
CountDownLatch latch = new CountDownLatch(3);
for (int i = 1; i <= 3; i++)
{
final int id = i;
new Thread(() -> {
System.out.println("Thread " + id + " started");
latch.countDown();
}).start();
}
latch.await();
System.out.println("All threads finished");
}
}
Результат выполнения кода:
"Thread 1 started"
"Thread 2 started"
"Thread 3 started"
"All threads finished"
Пример
Давайте используем версию метода с таймаутом. Если потоки
не успеют завершиться за 1 секунду, метод вернет
false:
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
CountDownLatch latch = new CountDownLatch(2);
new Thread(() -> {
try
{
TimeUnit.SECONDS.sleep(3);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
latch.countDown();
}).start();
boolean res = latch.await(1, TimeUnit.SECONDS);
System.out.println("Result: " + res);
}
}
Результат выполнения кода:
"Result: false"
Смотрите также
-
класс
CountDownLatch,
который представляет защелку обратного отсчета -
метод
countDown,
который уменьшает счетчик защелки -
класс
CyclicBarrier,
который синхронизирует потоки в общей точке -
класс
Semaphore,
который ограничивает число потоков