• Java 多线程之CyclicBarrier


    参考文章:http://www.jianshu.com/p/0c2af47f98fd

    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    /**
     *@className CyclicBarrierTest
     *@description :
     *      
     *
     *      CyclicBarrier是同步辅助类,它允许一组线程相互等待,直到到达某个公共屏障点。
     *
     *
     *      重要属性:
     *          锁对象 lock
                private final ReentrantLock lock = new ReentrantLock();
                trip 意思是 直到出错之前的条件 
                private final Condition trip = lock.newCondition();
                      参与者
                private final int parties;
                barrier将执行的任务或者命令
                private final Runnable barrierCommand;
                generation对象。Generation是其内部类
                private Generation generation = new Generation();
    
                private int count;  
    
    
     *      构造参数如下:
     *          CyclicBarrier(int parties);//指定了参与者数量的CyclicBarrier
     *          CyclicBarrier(int parties, Runnable barrierAction);//指定了参与者数量,并且当参与者都到达时,执行任务barrierAction
     *              if (parties <= 0) throw new IllegalArgumentException();
                    this.parties = parties;
                    this.count = parties;//将  参与者 数量赋值给count属性
                    this.barrierCommand = barrierAction;            
     *
     *      CyclicBarrier里面的内部类,它表示当前的CyclicBarrier是否是被损坏的。默认broken为false是完整的。
     *      private static class Generation {boolean broken = false;}   
     *
     *      
     *
     *      重要方法:
     *      1.nextGeneration()它里面有三个操作,
     *          trip.signalAll();唤醒所有线程
                // set up next generation
                count = parties;
                generation = new Generation();重新生成Generation对象
     *      
     *      2.breakBarrier()  破坏CyclicBarrier
     *          generation.broken = true;
                count = parties;
                trip.signalAll();
     *      .await(),它的内部是调用dowait(false, 0L);这里表示 不超时限制。
     *          
     *      3.dowait(boolean timed, long nanos)这里的参数是:对于是否超时,及超时的限制。
     *
     *      dowait的内部实现是:
     *          final ReentrantLock lock = this.lock;//获取到了显示锁。
                lock.lock();
                try {
                    final Generation g = generation; 获取CyclicBarrier的属性
                    //如果 CyclicBarrier 已损坏,就抛出异常BrokenBarrierException
                    if (g.broken)
                        throw new BrokenBarrierException();
                    //如果线程中断,破坏此CyclicBarrier并且抛出InterruptedException
                    if (Thread.interrupted()) {
                        breakBarrier();
                        throw new InterruptedException();
                    }
                //
                   int index = --count;  指定线程数量--
                   if (index == 0) {  // tripped   当index ==0 表示,所有指定的数目都已到达指定的公共屏障点
                       boolean ranAction = false;
                       try {
                           final Runnable command = barrierCommand;//把 barrierCommand属性赋给command
                           if (command != null)  如果创建对象指定barrierAction,将执行run方法
                               command.run();
                           ranAction = true;
                           nextGeneration();//执行完之后调用nextGeneration,更新CyclicBarrier状态,并且唤醒所有线程
                           return 0;
                       } finally {
                           if (!ranAction) //如果 未成功完成上述try中的操作,ranAction为false则会破坏此CyclicBarrier
                               breakBarrier();
                       }
                   }
    
                    // loop until tripped, broken, interrupted, or timed out
                    for (;;) {
                        try {
                            if (!timed)
                                trip.await();
                            else if (nanos > 0L)
                                nanos = trip.awaitNanos(nanos);
                        } catch (InterruptedException ie) {
                            if (g == generation && ! g.broken) {
                                breakBarrier();
                                throw ie;
                            } else {
                                // We're about to finish waiting even if we had not
                                // been interrupted, so this interrupt is deemed to
                                // "belong" to subsequent execution.
                                Thread.currentThread().interrupt();
                            }
                        }
    
                        if (g.broken)
                            throw new BrokenBarrierException();
    
                        if (g != generation)
                            return index;
    
                        if (timed && nanos <= 0L) {
                            breakBarrier();
                            throw new TimeoutException();
                        }
                    }
                } finally {
                    lock.unlock();  finally释放锁,这点要注意
                }
     *          
     *
     *@date 2017615日上午9:54:03
     *
     */
    public class CyclicBarrierTest {
    
        private static CyclicBarrier cBarrier = null;
    
        public static void main(String[] args) {
            cBarrier = new CyclicBarrier(5,new Runnable() {
    
                @Override
                public void run() {
                    System.out.println("人到齐了,开会吧");
                }
            });
    
            for(int i=0;i<5;i++){
                Thread party = new PartiesThread();
                /*if(i == 4){
                    party.interrupt();
    
                    try {
                        Thread.currentThread().sleep(10000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }*/
    
                party.start();
            }
        }
    
        static class PartiesThread extends Thread{
            public void run(){
                System.out.println(Thread.currentThread().getName()+"到了会议室");
                try {
                    cBarrier.await();
                } catch (InterruptedException | BrokenBarrierException e) {
                    e.printStackTrace();
                }
            }
        }
    
    }
  • 相关阅读:
    Python基础第十五天:初始面向对象
    Python基础第十四天:模块和包
    支付宝支付,邮件发送,短信推送,微信推送
    滑动验证
    Haystack全文检索
    Celery完成定时任务
    scrapy框架
    手机app抓包
    MongoDB数据库
    xpath解析数据
  • 原文地址:https://www.cnblogs.com/Kevin-1992/p/12608420.html
Copyright © 2020-2023  润新知