我们在使用多线程的过程中,我们可能有开启固定个线程后触发另一个线程的启动的需求,比如我们开会需要所有人都到齐了才能进行.
构造方法
CyclicBarrier(int parties, Runnable barrierAction)
CyclicBarrier(int parties)
CyclicBarrier原理
CyclicBarrier主要有一个方法, 当一个多线程调用await方法时,这些线程会阻塞,并且计数会加1.,当计数器的值变为所设值时,目标线程将会被唤醒,同时await方法阻塞的线程也会被唤醒.
使用
1package com.atguigu.juc.MyLock;
2
3import java.util.concurrent.BrokenBarrierException;
4import java.util.concurrent.CyclicBarrier;
5
6public class CycleBarrierDemo {
7 public static void main(String[] args) {
8 // 计数器从0开始,当计数器的数值到达7时,触发该线程的执行
9 CyclicBarrier cyclicBarrier = new CyclicBarrier(7, () -> {
10 System.out.println("七颗龙珠集齐召唤神龙");
11 });
12
13 for (int i = 1; i <= 7; i++) {
14 final int num = i;
15 new Thread(() -> {
16 System.out.println("第" + Thread.currentThread().getName() + "颗龙珠集齐了");
17 try {
18 // 只要计数器的值还没有到达设定的值(7),线程等待
19 cyclicBarrier.await();
20 } catch (InterruptedException e) {
21 e.printStackTrace();
22 } catch (BrokenBarrierException e) {
23 e.printStackTrace();
24 }
25 }, String.valueOf(num)).start();
26 }
27
28 }
29}/**OUtput
30第1颗龙珠集齐了
31第2颗龙珠集齐了
32第3颗龙珠集齐了
33第4颗龙珠集齐了
34第5颗龙珠集齐了
35第6颗龙珠集齐了
36第7颗龙珠集齐了
37七颗龙珠集齐召唤神龙
38*///~