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

Класс CyclicBarrier, примеры реализации кода в JavaВ программировании нередко возникают такие ситуации, когда два или больше потока должны находиться в режиме ожидания в предопределенной точке исполне­ния до тех пор, пока все эти потоки не достигнут данной точки.

Для этой цели в параллельном API предоставляется класс CyclicBarrier. Он позволяет определить объект синхронизации, который приостанавливается до тех пор, пока определенное количество потоков исполнения не достигнет некоторой барьерной точки.

В классе CyclicBarrier определены следующие конструкторы:

где параметр количество_потоков определяет число потоков, которые должны достигнуть некоторого барьера до того, как их исполнение будет продолжено.

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

Общая процедура применения класса CyclicBarrier следующая. Прежде всего нужно создать объект класса CyclicBarrier, указав количество ожидающих потоков исполнения.

А когда каждый поток исполнения достигнет барьера, следует вызвать метод await() для данного объекта. В итоге исполнение потока будет приостановлено до тех пор, пока метод await() не будет вызван во всех осталь­ных потоках исполнения.

Как только указанное количество потоков исполнения достигнет барьера, произойдет возврат из метода await(), и выполнение будет возобновлено. А если дополнительно указать какое-нибудь действие, то будет выполнен соответствующий поток.

У метода await() имеются следующие общие формы:

В первой форме ожидание длится до тех пор, пока каждый поток исполнения не достигнет барьерной точки.

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

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

Пользуюсь случаем хочу спросить аудиторию про один плагин WordPress. Дело в том, что желаю делать рассылку с помощью плагина CodeCanyon Mailster. Есть ли у вас опыт работы с ним и стоит ли игра свеч?

В приведенном ниже примере программы демонстрируется применение клас­са CyclicBarrier. Эта программа ожидает до тех пор, пока все три потока достиг­нут барьерной точки. Как только это произойдет, будет выполнен поток, опреде­ляемый действием типа BarAction.

Ниже приведен примерный результат выполнения данной программы. ( Конкретный порядок следования потоков исполнения может быть иным. )

Класс CyclicBarrier можно использовать повторно, поскольку он освобожда­ет ожидающие потоки исполнения всякий раз, когда метод await() вызывается из заданного количества потоков исполнения. Так, если внести следующие изме­нения в метод main() из предыдущего примера программы:

то результат ее выполнения будет таким, как показано ниже. ( Конкретный поря­док следования потоков исполнения может быть иным. )

Как показывает рассмотренный выше пример, класс CyclicBarrier предо­ставляет изящное решение задачи, которая раньше считалась сложной.

Интересное видео на сегодня: