并发新构件之CyclicBarrier
CyclicBarrier:叫做循环栅栏,名字挺好听的。JDK描述:允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
作用是好比我们一行人要去做地铁,每个人就是一个线程,来的人有早有晚(仿佛多个线程执行情况不一样),但是必须都到齐车站后,才能上车,少一个都不行,先到的人等待(await()),最后一个人await()之后发现人数齐了,所有人上车(所有线程再往下执行)。
构造器: CyclicBarrier(N);这个栅栏负责N个线程协作
await():如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,直到发生下列事情之一:
package com.houjun.current.newClassBank; import java.util.concurrent.*; /** * @Author: HouJun * @Date: 2019/10/17 13:43 * @Description: 循环栅栏 * @version: 1.0 */ public class CyclicBarrierTest { public static void main(String[] args) { ExecutorService executorService = Executors.newCachedThreadPool(); CyclicBarrier cyclicBarrier = new CyclicBarrier(2); for (int i = 0; i < 5; i++) { executorService.execute(new Way2(cyclicBarrier)); } } } class Way2 implements Runnable { private CyclicBarrier cyclicBarrier; Way2(CyclicBarrier cyclicBarrier) { this.cyclicBarrier = cyclicBarrier; } @Override public void run() { try { System.out.println("线程"+this+"到达"); cyclicBarrier.await(); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } System.out.println("全部到达北京西,一起出发吧"); } }