Thinking inJava学习笔记 HorseRace.java

HorseRace.java

每个horse每走一步,都会停下来等待其他horse完成这一步操作

cyclicBarrier的线程会在每一步所有horse完成操作后执行一次

package com.test.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

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){
	
	/*CyclicBarrier</tt> that will trip when the
     * given number of parties (threads) are waiting upon it, and which
     * will execute the given barrier action when the barrier is tripped,
     * performed by the last thread entering the barrier.
     */
		barrier=new CyclicBarrier(nHorses,new Runnable(){
			public void run(){
				StringBuilder sb=new StringBuilder();
				for(int i=0;i<FINISH_LINE;i++){
					sb.append("=");
				}
				System.out.println(sb.toString());
				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) {
					// TODO Auto-generated catch block
					System.out.println("barrier-action sleep interrupted");
					e.printStackTrace();
				}
			}
		});
		for(int i=0;i<nHorses;i++){
			Horse horse=new Horse(barrier);
			horses.add(horse);
			exec.execute(horse);
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new HorseRace(7,200);
	}

}
class Horse implements Runnable{
	@Override 
	public void run(){
		try {
			while(!Thread.interrupted()){
				synchronized(this){
					strides+=rand.nextInt(3);
				}
				barrier.await();
			}
			
		} catch (InterruptedException | BrokenBarrierException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	public String tracks() {
		// TODO Auto-generated method stub
		StringBuilder sb=new StringBuilder();
		for(int i=0;i<getStrides();i++){
			sb.append("*");
		}
		sb.append(id);
		return sb.toString();
	}
	private static int counter=0;
	private final int id=counter++;
	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 String toString(){
		return "Horse id: "+id;
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值