【Java多线程与并发库】13.java5的CyclicBarrier同步工具

本文介绍了 Java 并发库中的 CyclicBarrier 类,一种使多个线程互相等待直至到达公共屏障点的工具。适用于需要固定数量线程间同步的场景,并支持在所有线程到达后执行特定任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CyclicBarrier循环路障

(1)概念

首先用通俗的话解释,表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,然后在指定地点集合后再同时开始就餐的场景。

CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该barrier 在释放等待线程后可以重用,所以称它为循环的barrier。

CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作 很有用。



样例代码:
package cn.edu.hpu.test;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CyclicBarrierTest {
    public static void main(String[] args){
        ExecutorService service=Executors.newCachedThreadPool();
        final CyclicBarrier cb=new CyclicBarrier(3);//创建三个线程循环路障对象
        for (int i = 0; i < 3; i++) {
            //创建三个一样的线程任务
            Runnable runnable=new Runnable(){

                public void run() {
                    try {
                        Thread.sleep((long)(Math.random()*10000));
                        System.out.println("线程:"+Thread.currentThread().getName()+
                                "即将到达集合点1,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
                                (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                        
                        cb.await();
                        
                        Thread.sleep((long)(Math.random()*10000));
                        System.out.println("线程:"+Thread.currentThread().getName()+
                                "即将到达集合点2,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
                                (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                        
                        cb.await();
                        
                        Thread.sleep((long)(Math.random()*10000));
                        System.out.println("线程:"+Thread.currentThread().getName()+
                                "即将到达集合点3,当前已有"+(cb.getNumberWaiting()+1)+"个已经到达,"+
                                (cb.getNumberWaiting()==2?"都到齐了,继续走啊":"正在等候"));
                        
                        cb.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    } catch (BrokenBarrierException e) {
                        e.printStackTrace();
                    }
                }
                
            };
            service.execute(runnable);
        }
        service.shutdown();
    }
}
首先利用Executors创建了一个缓存线程池(大小自适应),然后创建了3个CyclicBarrier对象,用于协调集合点,
之后创建了三个Runnable,每个Runnable都在一定时间内到达一个集合点,然后执行同步对象的await方法,来
实现各个线程任务互相等待直到全部达到一个集合点的时候再继续向下执行。

效果:


在日常项目开发中,如果需要一些线程同时到达一个点之后再继续各自运行,

可以使用CyclicBarr类来解决这类问题。

转载请注明出处:http://blog.csdn.net/acmman/article/details/52980880

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光仔December

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值