CountDownLatch 和 CompletableFuture 和 (ReentrantLock和Condition)的简单应用

在多线程中,控制并发的手段有很多,如何保证线程按照我们想要的顺序去执行呢? 今天使用CountDownLatch 和 CompletableFuture来简单操作一下.

例题: 三个线程 a b c 实现 a->b->c 的执行顺序。

CountDownLatch解法
public static void main(String[] args) throws InterruptedException {


        CountDownLatch countDownLatchA = new CountDownLatch(1);
        CountDownLatch countDownLatchB = new CountDownLatch(1);
        Thread a = new Thread(()->{
            // 输出a的ascii码值
            log.info(Thread.currentThread().getName()+"  "+(int)'a');
            countDownLatchA.countDown();
        },"a");
        Thread b = new Thread(()->{
            try {
                // 等待a执行完毕
                // 等待计数器归0 然后再向下执行
                countDownLatchA.await();
                // 输出b的ascii码值
                log.info(Thread.currentThread().getName()+"  "+(int)'b');
                countDownLatchB.countDown();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        },"b");
        Thread c = new Thread(()->{
            try {
                // 等待b执行完毕
                // 等待计数器归0 然后再向下执行
                countDownLatchB.await();
                // 输出c的ascii码值
                log.info(Thread.currentThread().getName()+"  "+(int)'c');
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        },"c");
        c.start();
        b.start();
        a.start();
    }

结果:
在这里插入图片描述

CompletableFuture解法
public static void main(String[] args) {
        // 三个线程   异步变同步
        CompletableFuture<Void> aRes = CompletableFuture.runAsync(()->{
            // 输出a的ascii码值
            System.out.println("第一步:a"+(int)'a');
        });
        CompletableFuture<Void> bRes = aRes.thenRun(()->{
            // 输出b的ascii码值
            System.out.println("第二步:b"+(int)'b');
        });
        CompletableFuture<Void> cRes = bRes.thenRun(()->{
            // 输出c的ascii码值
            System.out.println("第三步:c"+(int)'c');
        });
    }

结果:
在这里插入图片描述

参考 大神博客

第三种 参考 大神博客
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值