CyclicBarrier,juc下的同步工具类,简称循环栅栏。
让一组线程同时达到一个屏障(同步点)时被阻塞,直到最后一条线程达到屏障时,
所有在屏障前阻塞等待的线程都会被唤醒,然后继续执行。
应用场景:
例如朋友约一起打个篮球,你必须得等待双方人都到期了才能开始,不能来一场3v5的决赛吧。
这时候在最后一个人到来之前,前面先来的人必须得先等待(到达一个屏障时被阻塞),当最后一人
来到时(到达屏障),所有之前来的人都知道了比赛可以开始了(即阻塞的线程被唤醒),然后就开始
比赛吧。
public static void main(String[] args) throws Exception{
ExecutorService executorService = Executors.newFixedThreadPool(10);
//所有线程都设置完key value为统一输出map对象
Map<Integer, Integer> map = new ConcurrentHashMap<>();
int size = 5;
CyclicBarrier cyclicBarrier = new CyclicBarrier(size, () ->{
System.err.println("--所有线程都设置完key value 了 ---- " + map);
});
for (int i = 1; i <= size; i++) {
final int temp = i;
executorService.execute(()->{
try {
//模拟等待时间
Thread.sleep(new Random().nextInt(2000));
map.put(temp, temp);
System.err.println(Thread.currentThread().getName()+"setKey-Value---"+ temp+":"+temp);
cyclicBarrier.await();
System.err.println(Thread.currentThread().getName()+"都设置完key value 了,继续跑--"+ temp);
}catch (Exception e){
e.printStackTrace();
}finally {
}
});
}
executorService.shutdown();
}
输出如下
pool-1-thread-2setKey-Value---2:2
pool-1-thread-3setKey-Value---3:3
pool-1-thread-5setKey-Value---5:5
pool-1-thread-4setKey-Value---4:4
pool-1-thread-1setKey-Value---1:1
--所有线程都设置完key value 了 ---- {1=1, 2=2, 3=3, 4=4, 5=5}
pool-1-thread-2都设置完key value 了,继续跑--2
pool-1-thread-3都设置完key value 了,继续跑--3
pool-1-thread-5都设置完key value 了,继续跑--5
pool-1-thread-4都设置完key value 了,继续跑--4
pool-1-thread-1都设置完key value 了,继续跑--1
网友评论