多线程学习总结(五)——实现多线程的方法之CyclicBarrier

    声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
    这里说的其实已经不是怎么实现多线程了,而是关于多线程的应用了;
古时候,行军打仗,总喜欢分兵几路(可能是因为各个兵种行军速度不一样吧,(*^__^*) ),然后在某个指定地点会师,最好在一起的各路大军发起总攻。
这里用多线程怎么实现呢,也许你会说,简单啊,分几路兵,就开几个线程,到指定地点后,就相当于这些线程运行完,然后再开相同的线程数继续执行。
    当然上面说的方法是可行的,不过如果知道怎么使用CyclicBarrier这个类的话,其实可以更简单。
public class TestCyclicBarrier implements Runnable {
    private String name;//兵种名称
    private int speed;//行军速度
    private static int waittingPlace = 6;//会师地点和出发地点的距离
    private static int allDistance = 8;//要进攻的地点和出发地点的距离

    private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//假设只有三个兵种

    public TestCyclicBarrier(String name, int speed) {
        this.name = name;
        this.speed = speed;
    }

    private long getTime() {
        return (System.currentTimeMillis() / 1000);
    }

    @Override
    public void run() {
        int hasAchieved = 0;
        System.out.println(getTime() + "--" + name + "start ");
        while (hasAchieved <= allDistance) {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            hasAchieved = hasAchieved + speed;
            //判断是否到达会师地点
            if (hasAchieved == waittingPlace) {
                //判断是否是最后一个到达的
                if (cyclicBarrier.getNumberWaiting() == cyclicBarrier.getParties() - 1) {
                    System.out.println(getTime() + "--" + name
                            + " is lasted achieved zhe waittingPlace");
                } else {
                    System.out.println(getTime() + "--" + name + " reached at waittingPlace");
                }
                try {
                    cyclicBarrier.await();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            } else {
                System.out.println(getTime() + "--" + name + " achieved " + hasAchieved);
            }
        }
        System.out.println(getTime() + "--" + name + " has completed achieved ");
    }

    public static void main(String[] args) {
        ExecutorService service = Executors.newCachedThreadPool();
        service.execute(new TestCyclicBarrier("骑兵", 3));
        service.execute(new TestCyclicBarrier("步兵", 2));
        service.execute(new TestCyclicBarrier("弩车兵", 1));
    }
}

控制台显示:
1475657908–步兵start
1475657908–弩车兵start
1475657908–骑兵start
1475657909–骑兵 achieved 3
1475657909–弩车兵 achieved 1
1475657909–步兵 achieved 2
1475657910–弩车兵 achieved 2
1475657910–步兵 achieved 4
1475657910–骑兵 reached at waittingPlace
1475657911–步兵 reached at waittingPlace
1475657911–弩车兵 achieved 3
1475657912–弩车兵 achieved 4
1475657913–弩车兵 achieved 5
1475657914–弩车兵 is lasted achieved zhe waittingPlace
1475657915–步兵 achieved 8
1475657915–骑兵 achieved 9
1475657915–弩车兵 achieved 7
1475657915–骑兵 has completed achieved
1475657916–弩车兵 achieved 8
1475657916–步兵 achieved 10
1475657916–步兵 has completed achieved
1475657917–弩车兵 achieved 9
1475657917–弩车兵 has completed achieved
很明显从控制台中可以看出CyclicBarrier达到了预期的效果,主要是通过cyclicBarrier.await();到达指定地点时让该线程阻塞来完成的,
当所有线程都阻塞时就唤醒全部线程(内部实现了该功能无需我们调用)继续往下执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值