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!