java模擬百米賽跑 求指點

package com.haoran.thread.pool;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

/**
 * 考察Future CountDownLatch CyclicBarrier Executors使用
 * 運動會上百米賽跑的項目
 * 一、等待全部的運動員準備就緒
 * 二、裁判的發令槍響
 * 三、運動員使出洪荒之力開始奔跑
 * 四、等待最後一名運單員跑至終點並公佈全部運動員的成績
 */
public class Running {
	public static void main(String[] args) {
		int amout = 8;
		CountDownLatch count = new CountDownLatch(amout);
		CountDownLatch begin = new CountDownLatch(1);
		/**
		 * 發令員裁判的角色
		 */
		CyclicBarrier cyclicBarrier = new CyclicBarrier(amout, new Runnable() {
			@Override
			public void run() {
				System.out.println("全部運動員已經準備就緒 ,發令槍響...");
			}
		});
		ExecutorService exc = Executors.newCachedThreadPool();
		List<Future<Runner>> list = new ArrayList<Future<Runner>>();
		System.out.println("百米賽跑即將開始,請全部運動員立刻準備");
		for (int i = 1; i < amout+1 ; i++) {
			Runner runner = new Runner(cyclicBarrier,begin,count,i + "號運動員");
			Future<Runner> future = exc.submit(runner);
			list.add(future);
		}
		try {
			begin.countDown();
			count.await();
			exc.shutdown();
			System.out.println("賽跑結束.公佈成績");
			for (Future<Runner> future : list) {
				Runner runner = future.get();
				System.out.println(runner.getName()+"成績是:" +runner.getGrade());
			}
			 
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (ExecutionException e) {
			e.printStackTrace();
		}
		
	}
}

class Runner implements Callable<Runner> {
	private CountDownLatch begin;
	private CountDownLatch count;
	private CyclicBarrier cyclicBarrier;
	private String name;
	private Integer grade;
	public String getName() {
		return name;
	}
	public Integer getGrade() {
		return grade;
	}
	public void setGrade(Integer grade) {
		this.grade = grade;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Runner(CyclicBarrier cyclicBarrier,CountDownLatch begin,CountDownLatch count, String name) {
		this.cyclicBarrier=cyclicBarrier;
		this.begin=begin;
		this.count = count;
		this.name = name;
	}
	@Override
	public Runner call() throws Exception {
		try {
			System.out.println(this.name + " 已經就位準備起跑"); 
			begin.await();
			cyclicBarrier.await();
			System.out.println(this.name + "起跑"); 
			int nextInt = new Random().nextInt(9000);
			Thread.sleep(nextInt);
			System.out.println(this.name + " 跑到終點了"); 
			this.setGrade(nextInt);
			count.countDown();
		} catch (InterruptedException e) {
			e.printStackTrace();
		} catch (BrokenBarrierException e) {
			e.printStackTrace();
		}
		
		return this;
	}
	

	
}
相關文章
相關標籤/搜索