并发编程丨CountDownLatch的使用小demo

1 CountDownLatch 用法

CountDownLatch是java.util.concurrent包中一个类,CountDownLatch只要提供的机制是多个(具体数量等于初始化CountDownLatch时count的值)线程都达到了预期状态或者完成了预期工作时触发事件,其他线程可以等待这个事件来触发自己后续的工作。等待的线程可以是多个,即CountDownLatch可以唤醒多个等待的线程。到达自己预期状态的线程会调用CountDownLatch的countDown方法,而等待的线程会调用CountDownLatch的await方法。

什么情况下可以用这个cdl呢?我平常约朋友们打英雄联盟(5V5竞技游戏),然后总有那么一个人要在大家都上号了之后他才上号,这个情形就可以使用CDL来表示,废话不说直接上demo!

Player类作为我们提前上号的好队友,因为tx这垃圾服务器的存在,所以上号需要一定时间,这里随机数设置为等待0-10s~

/**
 * @author :ChenHao86
 * @date :Created in 2021/12/31 14:49
 * @description:
 * @modified By:
 * @version: $
 */
public class Player implements Runnable {

    private CountDownLatch downLatch;

    private String name;

    public Player(CountDownLatch downLatch, String name) {
        this.downLatch = downLatch;
        this.name = name;
    }

    public void run() {
        this.doWork();
        try {
            TimeUnit.SECONDS.sleep(new Random().nextInt(10));
        } catch (Exception e) {
        }
        System.out.println(this.name + "已经上号了!");
        this.downLatch.countDown();

    }

    private void doWork() {
        System.out.println(this.name + "正在上号!");
    }

}

BadPlayer作为等大家都上了号以后,才上号那个拖延症坏队友


/**
 * @author :ChenHao86
 * @date :Created in 2021/12/31 14:49
 * @description:
 * @modified By:
 * @version: $
 */
public class BadPlayer implements Runnable {

    private CountDownLatch downLatch;

    public BadPlayer(CountDownLatch downLatch){
        this.downLatch = downLatch;
    }

    public void run() {
        System.out.println("拖延症玩家等其他队友都上号.....");
        try {
            this.downLatch.await();
        } catch (Exception e) {
        }
        System.out.println("其他队友都上号了,他终于上号了~!!");
    }

}

主方法


/**
 * @author :ChenHao86
 * @date :Created in 2021/12/31 14:50
 * @description:
 * @modified By:
 * @version: $
 */
public class CountDownLatchDemo {

    public static void main(String[] args) {
        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 5, 5, TimeUnit.SECONDS, new ArrayBlockingQueue(16));

        CountDownLatch latch = new CountDownLatch(3);

        Player p1 = new Player(latch, "盖伦");
        Player p2 = new Player(latch, "瑞兹");
        Player p3 = new Player(latch, "娑娜");
        Player p4 = new Player(latch, "赵信");

        BadPlayer badPlayer = new BadPlayer(latch);

        executor.execute(p3);
        executor.execute(p2);
        executor.execute(p1);
        executor.execute(p4);
        executor.execute(badPlayer);

        executor.shutdown();
    }

}

shift+F10执行方法

在这里插入图片描述
搞定~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值