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();
  • 相关阅读:
    通过WCF引用ListData.svc查询,更新数据
    SharePoint2010 BCS搜索结果的标题
    多个Finder方法的外部内容类型
    SharePoint 2010 中的BCS身份验证模式
    使用Visual Studio工作流发布SharePoint网页
    PerformancePoint Services故障排除
    使用SharePoint 2010模式对话框
    在自定义字段类型的CAML中使用AJAX jQuery
    扩展Visual Studio 2010服务器资源管理器中的SharePoint结点
    BCS配置文件页、爬网与搜索
  • 原文地址:https://www.cnblogs.com/rocky-fang/p/6763794.html
Copyright © 2011-2022 走看看