zoukankan      html  css  js  c++  java
  • Java CyclicBarrier Example

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

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

    在实际应用中,有时候需要多个线程同时工作以完成同一件事情,而且在完成过程中,往往会等待其他线程都完成某一阶段后再执行,等所有线程都到达某一个阶段后再统一执行。

    比如有几个旅行团需要途经深圳、广州、韶关、长沙最后到达武汉。旅行团中有自驾游的,有徒步的,有乘坐旅游大巴的;这些旅行团同时出发,并且每到一个目的地,都要等待其他旅行团到达此地后再同时出发,直到都到达终点站武汉。

    这时候CyclicBarrier就可以派上用场。CyclicBarrier最重要的属性就是参与者个数,另外最要方法是await()。当所有线程都调用了await()后,就表示这些线程都可以继续执行,否则就会等待。

    View Code
    package com.my.hqb;
    
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.concurrent.BrokenBarrierException;
    import java.util.concurrent.CyclicBarrier;
    
    public class CyclicBarrierExample implements Runnable {
    
        private static final String CITY5 = "WuHan";
    
        private static final String CITY4 = "ChangSha";
    
        private static final String CITY3 = "ShaoGuan";
    
        private static final String CITY2 = "GuangZhou";
    
        private static final String CITY1 = "ShenZhen";
    
        private static final String ReachedGreet = "We are reached ";
        
        private CyclicBarrier cyclicBarrier;
        
        private SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
        
        public CyclicBarrierExample(CyclicBarrier cyclicBarrier) {
            this.cyclicBarrier = cyclicBarrier;    
        }
        
        @Override
        public void run() {
            try {
                showMessage(CITY1);
                cyclicBarrier.await();
                Thread.sleep(5000);
                
                showMessage(CITY2);
                cyclicBarrier.await();
                Thread.sleep(5000);
                            
                showMessage(CITY3);
                cyclicBarrier.await();
                Thread.sleep(5000);
                
                showMessage(CITY4);
                cyclicBarrier.await();
                Thread.sleep(5000);
                
                showMessage(CITY5);            
                cyclicBarrier.await();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    
        private void showMessage(String city) {
            System.out.println(ReachedGreet + city + ", " + Thread.currentThread().getName() + ", " + dateFormat.format(new Date()));
        }
        
        /**
         * @param args
         * @throws IOException
         */
        /**
         * @param args
         * @throws IOException
         */
        public static void main(String[] args) throws IOException {
            int tourerNumber = 10;
            
            CyclicBarrier barrier = new CyclicBarrier(tourerNumber, new Runnable(){
                
                @Override
                public void run() {
                    System.out.println("--------------We all are reached, let's go to next city!--------------");
                }
            });
     
            for (int i = 0; i < tourerNumber; i++) {
                new Thread(new CyclicBarrierExample(barrier)).start();
            }
            
            System.out.println("Main Thread end");
        }
    }
  • 相关阅读:
    C、C++笔记
    日向blog开发记录
    項目生成順序錯誤導致的鏈接ERROR
    vs单元测试demo
    让CtrlList的某一行自定义颜色
    MFC软件的一点没用的调试经验……
    VS单步调试DLL形式的COM组件的过程
    socket udp编程的一些积累的记录
    git push报错大文件,删除后重新commit依然报错
    CC++串口通信编程的一点技术记录
  • 原文地址:https://www.cnblogs.com/BenWong/p/2958938.html
Copyright © 2011-2022 走看看