CyclicBarrier в Java
Last updated: 7 мая 2025 г.Принцып работы CyclicBarrier
такой: потоки зависают друг за другом в месте вызова в них await
. Когда зависло необходимое количество потоков, зависнувшие потоки развисают и запускается другой дополнительный отдельный поток в котором можно что-то сделать, например обработать данные, полученные в предыдущих потоках.
В примере ниже мы создаем переменную volatile
и потоки добавляют к ней 1, потом в месте await
они останавливаются и когда зависнет указанное в CyclicBarrier
количество потоков потоки развисают и сразу после этого запускается метод run
в классе Run. И в этом методе run класса Run будет использована эта ранее изменяемая зависающими потоками переменная.
Пример программы:
1import java.io.*;
2import java.util.concurrent.CyclicBarrier;
3
4class CyclicBarrierExample {
5 //к этой переменной добавляется 1
6 //в потоках SomeThread
7 static volatile int j;
8
9 public static void main(String[] args) {
10 //Только когда на await зависнут три потока все
11 //зависнувшие потоки развиснут.
12 //и метод run в классе Run запуститься только
13 //когда все три потока дойдут до await
14 CyclicBarrier cycbar =
15 new CyclicBarrier(6, new Run());
16 for (int i = 1; i < 7; i++){
17 SomeThread t = new SomeThread();
18 t.setName("Thread "+ i);
19 t.cycbar = cycbar;
20 t.start();
21 }
22 }
23
24 //здесь в Run выводиться результирующее j
25 static class Run extends Thread {
26 @Override
27 public void run(){
28 System.out.println(j);
29 }
30 }
31
32 static class SomeThread extends Thread{
33 CyclicBarrier cycbar;
34 @Override
35 public void run(){
36 try{
37 j++;
38 System.out.println(
39 Thread.currentThread().getName()+" "+j);
40 cycbar.await(); //здесь поток зависает
41 System.out.println(
42 Thread.currentThread().getName()
43 + " is alive again");
44 }
45 catch(Exception e){}
46 }
47 }
48}
Вывод:

Как видим шесть потоков остановили свою работу, потом запустился поток Run и вывел 6 и потом потоки продолжили работу.
Следующие уроки
Корректная остановка потоков с помощью Interrupt
14
мин.
Callable в Java
12
мин.
ExecutorService: управление пулом потоков
15
мин.