Java并发-类库新组件 - CyclicBarrier 理解

通过编写一个多线程的赛马的比赛,进行理解新组件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!


注意理解 CyclicBarrier 使用的思想。


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值