java CyclicBarrier
CyclicBarrier是一种在多线程编程中使用的同步机制,协调多个线程之间的执行。CyclicBarrier的字面意思是“循环屏障”,意味着当所有线程都到达这个屏障时,它们会一起继续执行。
代码:
static void testCyclicBarrier() {AtomicInteger phase = new AtomicInteger(0);String[] people = {"黄老邪", "欧阳锋", "洪七公", "段智兴", "老顽童", "王重阳"};// CyclicBarrier用于协调多个线程之间的执行。CyclicBarrier的字面意思是“循环屏障”// ,意味着当所有线程都到达这个屏障时,它们会一起继续执行。CyclicBarrier barrier = new CyclicBarrier(people.length, () -> {if (phase.addAndGet(1) == 1) {System.out.println("所有大侠在大理皇宫集合完毕,泡妞后继续出发去华山");} else if (phase.get() == 2) {System.out.println("所有大侠集合在华山集合完毕,开始比武");}});for (int i = 0; i < people.length; i++) {int finalI = i;new Thread(new Runnable() {@Overridepublic void run() {// 第一阶段:独立行进到集合点大理皇宫try {Thread.sleep((int)(Math.random() * 1000));} catch (InterruptedException e) {}System.out.println(people[finalI] + " 到达集合点大理皇宫");try {barrier.await(); // 等待所有线程到达A点} catch (InterruptedException e) {} catch (BrokenBarrierException e) {}// 第二阶段:独立行进到集合点华山(重用同一屏障)try {Thread.sleep((int)(Math.random() * 1000));} catch (InterruptedException e) {}System.out.println(people[finalI] + " 到达集合点华山");try {barrier.await();} catch (InterruptedException e) {} catch (BrokenBarrierException e) {}}}).start();}}
打印:
ok 。
另外, java的并发工具类还有CountDownLatch 、Semaphore。CountDownLatch为计数器闭锁,等待多个任务完成(如主线程等待子任务全部结束)。Semaphore为信号量,控制同时访问资源的线程数量(如限流场景),当信号量设置为1时可以代替同步锁。 代码略