CyclicBarrier的用法

CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。

  1.  CyclicBarrier初始化时规定一个数目,然后计算调用了CyclicBarrier.await()进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续。 
  2.  CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍。 
  3.  CyclicBarrier初始时还可带一个Runnable的参数, 此Runnable任务在CyclicBarrier的数目达到后,所有其它线程被唤醒前被执行

实例:

public class TestCyclicBarrier {

    private static final int THREAD_NUM = 5;
    
    public static class WorkerThread implements Runnable{

        CyclicBarrier barrier;
        
        public WorkerThread(CyclicBarrier b){
            this.barrier = b;
        }
        
        @Override
        public void run() {
            // TODO Auto-generated method stub
            try{
                System.out.println("Worker's waiting");
                //线程在这里等待,直到所有线程都到达barrier。
                barrier.await();
                System.out.println("ID:"+Thread.currentThread().getId()+" Working");
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }
    
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
            //当所有线程到达barrier时执行
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("Inside Barrier");
                
            }
        });
        
        for(int i=0;i<THREAD_NUM;i++){
            new Thread(new WorkerThread(cb)).start();
        }
    }

}
/*
以下是输出:
Worker's waiting
Worker's waiting
Worker's waiting
Worker's waiting
Worker's waiting
Inside Barrier
ID:12 Working
ID:8 Working
ID:11 Working
ID:9 Working
ID:10 Working
*/


CyclicBarrier 是 Java 中的一个同步工具类,它可以协调多个线程之间的执行。具体来说,当多个线程都达到了某个屏障点时,它们才能继续执行下去。 CyclicBarrier用法如下: 1. 创建一个 CyclicBarrier 对象,并指定需要等待的线程数量和屏障点执行的操作: ``` CyclicBarrier barrier = new CyclicBarrier(3, () -> { // 屏障点执行的操作 System.out.println("All threads have reached the barrier"); }); ``` 2. 在需要等待的线程中,调用 await() 方法等待其他线程达到屏障点: ``` Thread thread1 = new Thread(() -> { // 线程 1 执行的代码 try { System.out.println("Thread 1 is waiting at the barrier"); barrier.await(); System.out.println("Thread 1 has passed the barrier"); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); ``` 3. 启动线程并等待它们执行完毕: ``` thread1.start(); // 启动其他线程 thread1.join(); // 等待其他线程执行完毕 ``` 在上面的例子中,我们创建了一个 CyclicBarrier 对象,需要等待 3 个线程到达屏障点才能继续执行。线程 1 在执行过程中调用了 await() 方法等待其他线程,当所有线程都到达屏障点时,屏障点执行的操作会被执行。最后,我们等待所有线程执行完毕,程序结束。 需要注意的是,如果在等待过程中有一个线程被中断或者屏障点执行的操作抛出异常,那么所有等待的线程都会被中断并抛出 BrokenBarrierException 异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值