think in java笔记: java.util.concurrent.CyclicBarrier

来源:互联网 发布:iphone6透明屏幕软件 编辑:程序博客网 时间:2024/05/14 00:28

CyclicBarrier理解

示例程序:

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;    }    public void run() {        try {            //这里使用循环,horse一直跑            while(!Thread.interrupted()) {                synchronized(this) {                    strides += rand.nextInt(3); //Produce 0, 1 and 2                }                barrier.await();            }        } catch(InterruptedException | BrokenBarrierException e) {            // A legitimate way to exit            System.out.println(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();    }}/** * Using CyclicBarriers  * @author sut * @version $Revision:$ */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) {        //new Runnable()每次到达await()完毕之后,就执行        barrier = new CyclicBarrier(nHorses, new Runnable(){            public void run() {                StringBuilder s = new StringBuilder();                for(int i = 0; i < FINISH_LINE; i++)                    s.append("="); // The fence on the racetrack                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");                }            }        });        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){ //optional argument            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 0