Класс CountDownLatch, примеры реализации кода в Java

Класс CountDownLatch, примеры реализации кода в JavaИногда требуется, чтобы поток исполнения находился в режиме ожидания до тех пор, пока не наступит одно (или больше) событие.

Для этих целей в парал­лельном API предоставляется класс CountDownLatch, реализующий самоблокировку с обратным отсчетом. Объект этого класса изначально создается с количеством событий, которые должны произойти до того момента, как будет снята самоблокировка. Всякий раз, когда происходит событие, значение счетчика уменьшается.

Как только значение счетчика достигнет нуля, самоблокировка будет снята.

В классе CountDownLatch имеется приведенный ниже конструктор, где пара­метр число определяет количество событий, которые должны произойти до того, как будет снята самоблокировка.

Для ожидания по самоблокировке в потоке исполнения вызывается метод await(), общие формы которого приведены ниже.

В первой форме ожидание длится до тех пор, пока отсчет, связанный с вызы­вающим объектом типа CountDownLatch, не достигнет нуля. А во второй форме ожидание длится только в течение определенного периода времени, определяе­мого параметром ожидание.

Время ожидания указывается в единицах, обозначаемых параметром единица_времени, который принимает объект перечисления TimeUnit.

Метод await() возвращает ло­гическое значение false, если достигнут предел времени ожидания, или логиче­ское значение true, если обратный отсчет достигает нуля.

Чтобы известить о событии, следует вызвать метод countDown(). Ниже при­ведена общая форма этого метода. Всякий раз, когда вызывается метод countDown(), отсчет, связанный с вызывающим объектом, уменьшается на единицу.

В приведенном ниже примере программы демонстрируется применение клас­са CountDownLatch. В этой программе устанавливается самоблокировка, которая снимается только после наступления пяти событий.

Ниже приведен результат выполнения данной программы:

В теле метода mаin() устанавливается самоблокировка в виде объекта cdl типа CountDownLatch с исходным значением обратного отсчета, равным 5.

Затем соз­дается экземпляр класса MyThread, который начинает исполнение нового потока. Обратите внимание на то, что объект cdl передается в качестве параметра кон­структору класса MyThread и сохраняется в переменной экземпляра latch.

Далее в главном потоке исполнения вызывается метод await() для объекта cdl, в резуль­тате чего исполнение главного потока приостанавливается до тех пор. пока обратный отсчет самоблокировки не уменьшится на единицу пять раз в объекте cdl.

В теле метода run() из класса MyThread организуется цикл, который повторяется пять раз. На каждом шаге этого цикла вызывается метод countDown() для пе­ременной экземпляра latch, которая ссылается на объект cdl в методе main(). По завершении пятого шага цикла самоблокировка снимается, позволяя возобно­вить главный поток исполнения.

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

Советуем вам следующее интересное видео: