CountDownLatch与CyclicBarrier

这次介绍的是JAVA并发容器中的俩个常见容器:CountDownLatch与CyclicBarrier

CountDownLatch (闭锁)

听听这个名字,直白的翻译就是倒计时锁,功能也差不多,下面我白话介绍一下:

裁判在主持比赛通常都倒计时一下,3,2,1跑!然后几个运动员听到0的瞬间猛的跑出去。
CountDownLatch 的countDown方法执行一次就回在数量上减一,减到零的时候就会在当前这个锁阻塞的地方(此处就是await方法处)继续执行。

代码示例如下:

package com.healist.coder;

import java.util.concurrent.CountDownLatch;

/**
 * @Author healist
 * @Description
 * @Create 2018-02-22 下午4:45
 */
public class CountDownBarrier {

    public static void main(String[] args) {
        int num = 5;
        CountDownLatch start = new CountDownLatch(1);
        CountDownLatch end = new CountDownLatch(5);

        for(int i=0; i<num; i++) {
            new Thread(new Sporter("Sporter"+i, start, end)).start();
        }

        //裁判喊到0开始比赛
        start.countDown();

        long startTime = System.currentTimeMillis();

        try {
            //等待运动员全部跑完
            end.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            long endTime = System.currentTimeMillis();
            System.out.println("All Arrived!!!");
            System.out.println("Cost Time:" + (endTime-startTime));
        }

    }


    static class Sporter implements Runnable{

        private String name;
        private CountDownLatch start;
        private CountDownLatch end;

        public Sporter(String name, CountDownLatch start, CountDownLatch end) {
            this.name = name;
            this.start = start;
            this.end = end;
        }

        public void run() {
            try {
                //裁判喊0开始跑的时候在此
                start.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                System.out.println(this.name + "arrived");
                end.countDown();
            }

        }
    }

}

运行结果:

Sporter4arrived
Sporter0arrived
Sporter1arrived
Sporter2arrived
Sporter3arrived
All Arrived!!!
Cost Time:2

CyclicBarrier(栅栏)

循环栅栏,其实等大家都集合完毕再去做其他事,这里还拿运动员跑步为例,假如5个运动员跑到终点后,大家就集合去网吧去吃鸡!

代码示例:

package com.healist.coder;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * @Author healist
 * @Description
 * @Create 2018-02-22 下午5:56
 */
public class CyclicBarrierLearn {

    public static void main(String[] args) {
        int num = 5;
        CyclicBarrier cyclicBarrier = new CyclicBarrier(num, new Runnable() {
            public void run() {
                System.out.println("集合完毕,吃鸡大吉!");
            }
        });

        for(int i=0; i<num; i++) {
            new Thread(new Sporter("Sporter"+i, cyclicBarrier)).start();
        }
    }


    static class Sporter implements Runnable{

        private String name;
        private CyclicBarrier barrier;

        public Sporter(String name, CyclicBarrier barrier) {
            this.name = name;
            this.barrier = barrier;
        }

        public void run() {
            try {
                System.out.println(this.name+":start to run");
                Thread.sleep(1000);
                System.out.println(this.name+":arrived!");
                this.barrier.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (BrokenBarrierException e) {
                e.printStackTrace();
            }

        }
    }

}

运行结果:

Sporter0:start to run
Sporter1:start to run
Sporter2:start to run
Sporter3:start to run
Sporter4:start to run
Sporter0:arrived!
Sporter3:arrived!
Sporter2:arrived!
Sporter1:arrived!
Sporter4:arrived!
集合完毕,吃鸡大吉!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值