Многопоточность. Класс CountDownLatch

Иногда возникают ситуации, когда поток необходимо приостановить до наступления какого-то события (или событий). Для этих целей в Java предусмотрен класс CountDownLatch (представлен в Java 1.5). Объект класса CountDownLatch создается со счетчиком событий, который уменьшается по мере возникновения событий, как только счетчик будет равен 0, блокировка потока будет снята. Во время ожидания снятия блокировки может возникнуть исключения вида InterruptedException, поэтому вызов метода ожидания должен быть обернут в блок try/catch или в самом методе должно быть объявлено, что в нем может возникнуть исключение.

Если обратиться к документации класса CountDownLatch или просто посмотреть исходный код, то можно увидеть конструктор, который в качестве параметра принимает количество событий (в формате int), которые должны произойти для снятия блокировки.

Для ожидания окончания блокировки в классе CountDownLatch используется метод await, который представлен в двух формах. В первой – ожидание длится до тех пор, пока отсчет не достигнет 0:

Во второй форме метода await – ожидание длится только определенный период времени. Если период времени истек, то метод завершится и вернет false, если же счетчик событий достигнет 0, то метод вернет true:

Рассмотрим простой пример:

Результат выполнения:

В методе main() создается блокировка latch с обратным отсчетом 3. Далее создается экземпляр класс CustomThread и включается блокировка latch.await(). Блокировка latch.await() обязательно должна быть обернута блоком try/catch.
Класс CustomThread реализует интерфейс Runnable. В конструктор класса передается блокировка (latch) и запускается сам поток. В цикле for метода run происходит уменьшение счетчика срабатывания блокировки latch.countDown().

Исходный код доступен на GitHub

Site Footer