通过编写一个多线程的赛马的比赛,进行理解新组件CyclicBarrier 的用法的理解
package com.xyw.concurrent.blog;
import java.util.*;
import java.util.concurrent.*;
/*
* CyclicBarrier 创建一组任务,并并行执行,然后进行下一步之前进行等待
* 等待的数量就是其初始化的数量
*/
class Horse implements Runnable{
private static int counter = 0;
private final int id = counter++; // 进行唯一的ID 的设置
private int strides = 0;
private static Random rand = new Random(47);
private static CyclicBarrier barrier;
public Horse(CyclicBarrier b){
barrier = b;
}
public synchronized int getStrides(){
return strides;
}
public void run(){
try{
while(!Thread.interrupted()){
synchronized(this){
strides += rand.nextInt(3);
}
barrier.await(); // 在这里,等待所有的马,完成任务,这里配合CyclicBarrier
}
}catch(InterruptedException e){
}catch(BrokenBarrierException e){
// 这个异常需要进行处理操作
throw new RuntimeException(e); // 进行重新抛出异常的操作
}
}
public String toString(){
return "Horse" + id + " ";
}
public String tracks(){
StringBuilder s = new StringBuilder();
for(int i = 0; i < getStrides(); i++){
s.append("*");
}
s.append(id);
return s.toString();
}
}
public class HorseRace {
static final int FINISH_LINE = 75;
private List<Horse> horses = new ArrayList<Horse>(); //创建赛马的数组
private ExecutorService exec = Executors.newCachedThreadPool(); // 进行线程池创建
private CyclicBarrier barrier;
public HorseRace(int nHorses, final int pause){
barrier = new CyclicBarrier(nHorses, new Runnable(){ // 创建CyclicBarrier 对象
public void run(){
StringBuilder s = new StringBuilder();
for(int i = 0; i < FINISH_LINE; i++){
s.append("=");
}
System.out.println(s);
for(Horse horse : horses)
System.out.println(horse.tracks());
for(Horse horse: horses){
if(horse.getStrides() >= FINISH_LINE){
System.out.println(horse + "won!");
exec.shutdownNow();
return;
}
}
try{
TimeUnit.MILLISECONDS.sleep(pause);
}catch(InterruptedException e){
System.out.println("barrier-action sleep interrupted");
}
}// 这个是栅栏动作,这里是作为匿名内部类创建的,它被交给了CyclicBarrier 的构造器
// 因为 CyclicBarrier 可以进行多次执行,所以这里面进行抽象出一个 Runable 对象
});
for(int i =0; i < nHorses; i++){
Horse horse = new Horse(barrier); // 用于初始化 barrier 对应的线程
horses.add(horse);
exec.execute(horse); // 现在进行线程的执行的操作的情况
}
}
public static void main(String[] args){
int nHorses = 7;
int pause = 200;
if(args.length > 0){ // 可选参数
int n = new Integer(args[0]);
nHorses = n > 0 ? n : nHorses;
}
if(args.length > 1){
int p = new Integer(args[1]);
pause = p > -1 ? p : pause;
}
new HorseRace(nHorses, pause);
}
}
下面是运行的结果,其中关键之处,已经标记了详细的注释
===========================================================================
**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
Horse6 won!