CycliBarrier :栅栏
作用: 可以使一组线程在达到同一个屏障之前阻塞,当最后一个线程到达屏障时,屏障打开,这一组线程继续
往下执行
构造方法:
new CyclicBarries(int parties)
parties 线程组的数量,当只有部分线程到达屏障时,该部分线程阻塞,当所有线程都到达屏障时,屏障放行
主要方法:
await : 让当前线程等待,当等待线程数等于指定数目时,唤醒所有的线程
reset: 可以重置barrier状态,开始新的barries
案例如下:
public class CyclicBarriesDemo {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(4);
public static void main(String[] args) {
System.out.println("主线程启动==============");
int parties = cyclicBarrier.getParties();
System.out.println(parties);
test();
System.out.println("主线程结束运行");
}
public static void test() {
new Thread(() -> {
try {
Thread.sleep(500);
System.out.println("一号线程数据准备完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("一号线程开始跑了");
}).start();
new Thread(() -> {
try {
Thread.sleep(500);
System.out.println("二号线程数据准备完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("二号线程数据开始跑了");
}).start();
new Thread(() -> {
try {
Thread.sleep(600);
System.out.println("三号线程数据准备完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("三号线程数据开始跑了");
}).start();
new Thread(() -> {
try {
Thread.sleep(1000);
System.out.println("四号线程数据准备完毕");
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
System.out.println("四号线程开始跑了哦");
}).start();
}
}
执行结果如下:
4
主线程结束运行
一号线程数据准备完毕
二号线程数据准备完毕
三号线程数据准备完毕
四号线程数据准备完毕
四号线程开始跑了哦
一号线程开始跑了
三号线程数据开始跑了
二号线程数据开始跑了