Топ-100CyclicBarrier в Java - CodOrbits
LogoCodOrbits

Раздел: Многопоточность

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

Все разделы
Иконка Многопоточность

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
мин.

Similar Articles Icon
Divider

Callable в Java

12
мин.

Similar Articles Icon
Divider

ExecutorService: управление пулом потоков

15
мин.

Similar Articles Icon