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;

class Horse implements Runnable{
    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) {
        this.barrier = b;
    }
    
    public synchronized int getStrides() {
        return strides;
    }
    
    @Override
    public void run() {
        try {
            while(!Thread.interrupted()){
                synchronized (this) {
                    strides += rand.nextInt(3);
                }
                barrier.await();//循环等待
            }
        } catch (InterruptedException e) {
            // TODO: handle InterruptedException
        } catch (BrokenBarrierException e) {
            throw new RuntimeException(e);
        }
    }
    
    @Override
    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() {
            @Override
            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("屏障—行为 sleep interrupted");
                }
            }
        });
        for (int i = 0; i < nHorses; i++) {
            Horse horse = new Horse(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);
    }
}

效果图:

  

最新文章

  1. css中的负边距
  2. Knockout.js随手记(8)
  3. C\C++中声明与定义的区别
  4. html 上传预览图片
  5. 关于mapcontrol和pagelayoutcontrol切换时闪退
  6. 使用virtualenv搭建独立的Python环境
  7. ubuntu dpkg 命令详解
  8. 移动WEB 性能优化方案
  9. Repeater删改
  10. background:linear-gradient()
  11. sql-定义变量
  12. Dataset
  13. 苹果手机 iframe 无法滚动bug
  14. Linux下定时备份数据库
  15. linux学习笔记---一些有趣的命令
  16. Android推断程序前后台状态
  17. Brackets 前端编辑器试用
  18. Oracle_单行函数
  19. 一、TensorFlow初探
  20. JavaWEB后端支付银联,支付宝,微信对接

热门文章

  1. LINQ系列:Linq to Object串联操作符
  2. SpringMVC+FreeMarker
  3. (第六天)DOM
  4. Python学习第一弹——Python环境搭建
  5. 【续集】在 IIS 中部署 ASP.NET 5 应用程序遭遇的问题
  6. spring源码分析之spring-core总结篇
  7. 【Debug】Web开发中,Tomcat正常启动,访问欢迎页404,怎么办?
  8. TCP的定时器
  9. CSS-清除浮动
  10. [Q&amp;A] 应用程序清单生成失败