java多线程之CyclicBarrier类

  1 import java.util.ArrayList;
  2 import java.util.List;
  3 import java.util.Random;
  4 import java.util.concurrent.BrokenBarrierException;
  5 import java.util.concurrent.CyclicBarrier;
  6 import java.util.concurrent.ExecutorService;
  7 import java.util.concurrent.Executors;
  8 import java.util.concurrent.TimeUnit;
  9 
 10 class Horse implements Runnable{
 11     private static int counter = 0;
 12     private final int id = counter++;
 13     private int strides = 0; //跨步
 14     private static Random rand = new Random(47);
 15     private static CyclicBarrier barrier;//环形栅栏
 16     public Horse(CyclicBarrier b){
 17         barrier = b;
 18     }
 19     public synchronized int getStrides() { return strides; } //返回现在到达的地点
 20     
 21     @Override
 22     public void run() {
 23         // TODO Auto-generated method stub
 24         try{
 25             while(!Thread.interrupted()){
 26                 synchronized(this){
 27                     strides += rand.nextInt(3);
 28                 }
 29                 barrier.await();//使计数器减1
 30             }
 31         }catch(InterruptedException e){
 32             return;
 33         }catch(BrokenBarrierException e) {
 34             // TODO Auto-generated catch block
 35             throw new RuntimeException(e);
 36         }
 37     }
 38     
 39     public String toString(){ 
 40         return "Horse " + id +" ";
 41     }
 42     public String tracks(){ //足迹、跟踪
 43         StringBuilder s = new StringBuilder();
 44         for(int i = 0;i<getStrides();i++){
 45             s.append("*");
 46         }
 47         s.append(id);
 48         return s.toString();
 49     }
 50 }
 51 
 52 
 53 public class HorseRace {
 54     static final int FINISH_LINE = 75;
 55     private List<Horse> horses = new ArrayList<Horse>();   //保存每匹马的信息
 56     private ExecutorService exec = Executors.newCachedThreadPool();
 57     private CyclicBarrier barrier;
 58     public HorseRace(int nHorses,final int pause){
 59         barrier = new CyclicBarrier(nHorses,new Runnable(){ //当计数减到0时自动执行1次
 60             @Override
 61             public void run() {
 62                 // TODO Auto-generated method stub
 63                 StringBuilder s = new StringBuilder();
 64                 for(int i=0;i<FINISH_LINE;i++){
 65                     s.append("=");
 66                 }
 67                 System.out.println(s);
 68                 for(Horse horse : horses){
 69                     System.out.println(horse.tracks());
 70                 }
 71                 for(Horse horse : horses){
 72                     if(horse.getStrides()>=FINISH_LINE) {
 73                         System.out.println(horse + "won!");
 74                         exec.shutdownNow();
 75                         return;
 76                     }
 77                 }
 78                 try{
 79                     TimeUnit.MILLISECONDS.sleep(pause);
 80                 }catch(InterruptedException e){
 81                     System.out.println("栅栏阻塞中断!!");
 82                 }
 83             }
 84             
 85         });
 86         
 87         for(int i=0;i<nHorses;i++){
 88             Horse horse = new Horse(barrier);
 89             horses.add(horse);
 90             exec.execute(horse); //增加七匹马
 91         }
 92         
 93     } 
 94     /**
 95      * @param args
 96      */
 97     public static void main(String[] args) {
 98         // TODO Auto-generated method stub
 99         int nHorses = 7;
100         int pause = 200;
101         new HorseRace(nHorses,pause);
102     }
103 }

运行结果:

===========================================================================
**0
**1
**2
*3
**4
*5
*6
===========================================================================
****0
***1
**2
*3
**4
**5
*6
===========================================================================
*****0
*****1
***2
***3
***4
***5
**6
===========================================================================
*****0
******1
****2
*****3
*****4
***5
**6
===========================================================================
******0
********1
****2
******3
******4
***5
***6
===========================================================================
******0
*********1
****2
*******3
******4
*****5
***6
===========================================================================
********0
**********1
****2
********3
*******4
******5
***6
===========================================================================
**********0
**********1
*****2
*********3
*********4
*******5
****6
===========================================================================
**********0
**********1
*****2
*********3
***********4
********5
****6
===========================================================================
***********0
**********1
*******2
**********3
***********4
*********5
******6
===========================================================================
************0
************1
*******2
************3
***********4
*********5
******6
===========================================================================
**************0
*************1
*********2
*************3
***********4
***********5
********6
===========================================================================
**************0
***************1
**********2
***************3
************4
***********5
********6
===========================================================================
****************0
***************1
************2
****************3
************4
************5
********6
===========================================================================
*****************0
*****************1
**************2
****************3
************4
************5
********6
===========================================================================
*******************0
*****************1
****************2
******************3
*************4
*************5
********6
===========================================================================
*********************0
******************1
*****************2
********************3
*************4
***************5
*********6
===========================================================================
*********************0
*******************1
******************2
*********************3
***************4
***************5
*********6
===========================================================================
*********************0
*******************1
*******************2
***********************3
*****************4
***************5
*********6
===========================================================================
*********************0
********************1
*******************2
*************************3
*******************4
****************5
***********6
===========================================================================
***********************0
********************1
*******************2
**************************3
*********************4
******************5
*************6
===========================================================================
*************************0
*********************1
*******************2
***************************3
*********************4
********************5
***************6
===========================================================================
*************************0
*********************1
*********************2
****************************3
**********************4
**********************5
****************6
===========================================================================
*************************0
*********************1
***********************2
******************************3
**********************4
************************5
******************6
===========================================================================
**************************0
*********************1
************************2
******************************3
**********************4
************************5
********************6
===========================================================================
***************************0
***********************1
**************************2
*******************************3
***********************4
*************************5
********************6
===========================================================================
***************************0
*************************1
****************************2
*******************************3
************************4
*************************5
*********************6
===========================================================================
****************************0
***************************1
****************************2
*********************************3
*************************4
**************************5
*********************6
===========================================================================
****************************0
*****************************1
****************************2
**********************************3
**************************4
***************************5
***********************6
===========================================================================
*****************************0
*****************************1
******************************2
***********************************3
****************************4
****************************5
*************************6
===========================================================================
*******************************0
*****************************1
******************************2
*************************************3
****************************4
****************************5
***************************6
===========================================================================
********************************0
*******************************1
*******************************2
*************************************3
****************************4
*****************************5
****************************6
===========================================================================
********************************0
*******************************1
*********************************2
*************************************3
*****************************4
*****************************5
******************************6
===========================================================================
********************************0
*********************************1
***********************************2
*************************************3
*******************************4
******************************5
********************************6
===========================================================================
********************************0
*********************************1
************************************2
*************************************3
*******************************4
********************************5
*********************************6
===========================================================================
********************************0
*********************************1
************************************2
*************************************3
********************************4
********************************5
***********************************6
===========================================================================
**********************************0
***********************************1
*************************************2
*************************************3
*********************************4
********************************5
***********************************6
===========================================================================
***********************************0
***********************************1
***************************************2
*************************************3
***********************************4
*********************************5
***********************************6
===========================================================================
*************************************0
************************************1
***************************************2
***************************************3
*************************************4
**********************************5
*************************************6
===========================================================================
***************************************0
*************************************1
****************************************2
***************************************3
***************************************4
**********************************5
***************************************6
===========================================================================
****************************************0
***************************************1
*****************************************2
***************************************3
****************************************4
************************************5
***************************************6
===========================================================================
******************************************0
*****************************************1
******************************************2
****************************************3
*****************************************4
**************************************5
***************************************6
===========================================================================
*******************************************0
*****************************************1
******************************************2
******************************************3
******************************************4
***************************************5
*****************************************6
===========================================================================
*******************************************0
*******************************************1
******************************************2
******************************************3
********************************************4
***************************************5
*****************************************6
===========================================================================
********************************************0
*********************************************1
******************************************2
********************************************3
********************************************4
*****************************************5
*******************************************6
===========================================================================
********************************************0
**********************************************1
******************************************2
*********************************************3
**********************************************4
*******************************************5
*******************************************6
===========================================================================
*********************************************0
************************************************1
********************************************2
***********************************************3
***********************************************4
*********************************************5
********************************************6
===========================================================================
**********************************************0
**************************************************1
*********************************************2
************************************************3
*************************************************4
*********************************************5
*********************************************6
===========================================================================
************************************************0
**************************************************1
***********************************************2
**************************************************3
**************************************************4
**********************************************5
**********************************************6
===========================================================================
*************************************************0
****************************************************1
*************************************************2
***************************************************3
***************************************************4
************************************************5
***********************************************6
===========================================================================
***************************************************0
******************************************************1
***************************************************2
*****************************************************3
***************************************************4
************************************************5
***********************************************6
===========================================================================
***************************************************0
******************************************************1
*****************************************************2
*****************************************************3
***************************************************4
*************************************************5
*************************************************6
===========================================================================
****************************************************0
******************************************************1
******************************************************2
*****************************************************3
****************************************************4
**************************************************5
**************************************************6
===========================================================================
****************************************************0
********************************************************1
*******************************************************2
*****************************************************3
******************************************************4
**************************************************5
***************************************************6
===========================================================================
******************************************************0
**********************************************************1
*******************************************************2
******************************************************3
********************************************************4
**************************************************5
****************************************************6
===========================================================================
******************************************************0
************************************************************1
********************************************************2
*******************************************************3
**********************************************************4
**************************************************5
******************************************************6
===========================================================================
********************************************************0
*************************************************************1
*********************************************************2
*********************************************************3
************************************************************4
****************************************************5
******************************************************6
===========================================================================
*********************************************************0
***************************************************************1
*********************************************************2
***********************************************************3
**************************************************************4
******************************************************5
******************************************************6
===========================================================================
***********************************************************0
***************************************************************1
**********************************************************2
***********************************************************3
***************************************************************4
******************************************************5
******************************************************6
===========================================================================
***********************************************************0
****************************************************************1
***********************************************************2
*************************************************************3
***************************************************************4
********************************************************5
********************************************************6
===========================================================================
*************************************************************0
****************************************************************1
************************************************************2
*************************************************************3
*****************************************************************4
********************************************************5
*********************************************************6
===========================================================================
*************************************************************0
******************************************************************1
*************************************************************2
**************************************************************3
*****************************************************************4
********************************************************5
***********************************************************6
===========================================================================
***************************************************************0
********************************************************************1
**************************************************************2
**************************************************************3
*****************************************************************4
********************************************************5
************************************************************6
===========================================================================
****************************************************************0
**********************************************************************1
***************************************************************2
***************************************************************3
*******************************************************************4
*********************************************************5
**************************************************************6
===========================================================================
*****************************************************************0
***********************************************************************1
***************************************************************2
***************************************************************3
*******************************************************************4
***********************************************************5
**************************************************************6
===========================================================================
*****************************************************************0
************************************************************************1
*****************************************************************2
***************************************************************3
********************************************************************4
************************************************************5
****************************************************************6
===========================================================================
*******************************************************************0
*************************************************************************1
******************************************************************2
***************************************************************3
********************************************************************4
**************************************************************5
******************************************************************6
===========================================================================
*********************************************************************0
**************************************************************************1
*******************************************************************2
***************************************************************3
**********************************************************************4
****************************************************************5
******************************************************************6
===========================================================================
***********************************************************************0
**************************************************************************1
********************************************************************2
****************************************************************3
***********************************************************************4
****************************************************************5
********************************************************************6
===========================================================================
*************************************************************************0
****************************************************************************1
**********************************************************************2
****************************************************************3
***********************************************************************4
****************************************************************5
**********************************************************************6
Horse 1 won!

原文地址:https://www.cnblogs.com/_programmer/p/3396619.html