zoukankan      html  css  js  c++  java
  • java.util.concurrent.CyclicBarrier 使用

    1.概述

      java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count),

      各线程通过调用barrier.await()进入等待,并且计数+1, 第count个线程调用await(),满足条件,

      唤醒所有之前调用await等待的线程(类似于公司班车, A上车A等着,B上车B等着, ...最后一个Z上车了, 班车发车)

    2. 示例

    package com.rocky.test.CyclicBarrier;
    
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class CyclicBarrierTest {
    
        
        public static void main(String[] args) {
            CyclicBarrier barrier = new CyclicBarrier(10, new Runnable(){
                public void run(){
                    System.out.println("inside barrier.................."+ Thread.currentThread().getName());
                }
            });
            for(int i=0; i<10; i++)
                new Thread(new Worker(barrier)).start();
        }
    }
    
    class Worker implements Runnable{
    
        private CyclicBarrier barrier;
        Worker(CyclicBarrier barrier){
            this.barrier = barrier;
        }
        @Override
        public void run() {
    
            System.out.println(Thread.currentThread().getName()+" ready go... ");
            try {
                barrier.await();
                System.out.println(Thread.currentThread().getName()+" done");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }
        }
    }

    控制台

    ..........
    Thread-8 ready go... 
    Thread-9 ready go... //最后一个执行await()的线程,会执行构造CyclicBarrier时Runnable中的任务(run()方法)
    inside barrier..................Thread-9
    Thread-9 done
    Thread-0 done
    ..............

    3. 说明        和CountDownLatch比较

       3.1 之所以叫CyclicBarrier(cyclic循环之意), 因为构造时设置的count可以循环运用

            一圈await结束之后, 线程继续调用await进入下一轮等待直到第count个线程await时一起唤醒。

       3.2 await()方法带有返回值,表示当前是第几个到达barrier的线程

       3.3 BrokenBarrierException异常  当某个等待的线程发生中断,会抛出该异常,其他等待的线程也会收到该异常,并返回。

    ..........
     if (g.broken)
                        throw new BrokenBarrierException();
  • 相关阅读:
    [刷题] PTA 7-32 说反话-加强版
    [算法] 堆
    [笔记] 《c++ primer》显示器程序 Chapter7
    [笔记] 《c++ primer》书店程序 Chapter7
    [c++] <vector>
    [笔记] 《c++ primer》书店程序 Chapter2
    [笔记] 《c++ primer》书店程序 Chapter 1
    253. Meeting Rooms II
    461. Hamming Distance
    252. Meeting Rooms
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/6763794.html
Copyright © 2011-2022 走看看