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; } }