JUC之CountdownLatch使用详解

 更新时间:2023年12月16日 08:50:59   作者:小晨想好好学习  
这篇文章主要介绍了JUC之CountdownLatch使用详解,CountdownLatch 用来进行线程同步协作,等待所有线程完成倒计时,
其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一,需要的朋友可以参考下

一、是什么?

CountdownLatch 用来进行线程同步协作,等待所有线程完成倒计时。

其中构造参数用来初始化等待计数值,await() 用来等待计数归零,countDown() 用来让计数减一

二、demo演示

public class TestCountDownLatch {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        test5();
    }
    private static void test5() {
        CountDownLatch latch = new CountDownLatch(3);
        ExecutorService service = Executors.newFixedThreadPool(4);
        service.submit(() -> {
            log.debug("begin...");
            sleep(1);
            latch.countDown();
            log.debug("end...{}", latch.getCount());
        });
        service.submit(() -> {
            log.debug("begin...");
            sleep(1.5);
            latch.countDown();
            log.debug("end...{}", latch.getCount());
        });
        service.submit(() -> {
            log.debug("begin...");
            sleep(2);
            latch.countDown();
            log.debug("end...{}", latch.getCount());
        });
        service.submit(()->{
            try {
                log.debug("waiting...");
                latch.await();
                log.debug("wait end...");
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
    }
}

在这里插入图片描述

三、应用之同步等待多线程准备完毕

 private static void test2() throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);
        ExecutorService service = Executors.newFixedThreadPool(10, (r) -> {
            return new Thread(r, "t" + num.getAndIncrement());
        });
        CountDownLatch latch = new CountDownLatch(10);
        String[] all = new String[10];
        Random r = new Random();
        for (int j = 0; j < 10; j++) {
            int x = j;
            service.submit(() -> {
                for (int i = 0; i <= 100; i++) {
                    try {
                        Thread.sleep(r.nextInt(100));
                    } catch (InterruptedException e) {
                    }
                    all[x] = Thread.currentThread().getName() + "(" + (i + "%") + ")";
                    System.out.print("\r" + Arrays.toString(all));
                }
                latch.countDown();
            });
        }
        latch.await();
        System.out.println("\n游戏开始...");
        service.shutdown();
    }

四、 应用之同步等待多个远程调用结束

    private static void test3() throws InterruptedException, ExecutionException {
        RestTemplate restTemplate = new RestTemplate();
        log.debug("begin");
        ExecutorService service = Executors.newCachedThreadPool();
        CountDownLatch latch = new CountDownLatch(4);
        service.submit(() -> {
            Map<String, Object> response = restTemplate.getForObject("http://localhost:8080/order/{1}", Map.class, 1);
            log.debug("{}",response);
            latch.countDown();
        });
       service.submit(() -> {
            Map<String, Object> response1 = restTemplate.getForObject("http://localhost:8080/product/{1}", Map.class, 1);
           log.debug("{}",response1);
           latch.countDown();
        });
        service.submit(() -> {
            Map<String, Object> response2 = restTemplate.getForObject("http://localhost:8080/product/{1}", Map.class, 2);
            log.debug("{}",response2);
            latch.countDown();
        });
        service.submit(() -> {
            Map<String, Object> response3 = restTemplate.getForObject("http://localhost:8080/logistics/{1}", Map.class, 1);
            log.debug("{}",response3);
            latch.countDown();
        });
        latch.await();
        log.debug("执行完毕");
        service.shutdown();
    }

到此这篇关于JUC之CountdownLatch使用详解的文章就介绍到这了,更多相关CountdownLatch使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot自带的缓存@EnableCaching用法

    springboot自带的缓存@EnableCaching用法

    这篇文章主要介绍了springboot自带的缓存@EnableCaching用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Java泛型extends及super区别实例解析

    Java泛型extends及super区别实例解析

    这篇文章主要介绍了Java泛型extends及super区别实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Java DelayQueue实现延时任务的示例详解

    Java DelayQueue实现延时任务的示例详解

    DelayQueue是一个无界的BlockingQueue的实现类,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。本文就来利用DelayQueue实现延时任务,感兴趣的可以了解一下
    2022-08-08
  • eclipse创建一个基于maven的web项目详细步骤

    eclipse创建一个基于maven的web项目详细步骤

    开始学习maven,并用maven创建了第一个属于自己的web项目,下面这篇文章主要给大家介绍了关于eclipse创建一个基于maven的web项目的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 必须了解的高阶JAVA枚举特性!

    必须了解的高阶JAVA枚举特性!

    这篇文章主要介绍了必须了解的高阶JAVA枚举特性!帮助大家更好的理解和学习Java枚举的相关知识,感兴趣的朋友可以了解下
    2021-01-01
  • 为什么阿里巴巴要求日期格式化时必须有使用y表示年

    为什么阿里巴巴要求日期格式化时必须有使用y表示年

    这篇文章主要介绍了为什么阿里巴巴要求日期格式化时必须有使用y表示年,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • java利用时间格式生成唯一文件名的方法

    java利用时间格式生成唯一文件名的方法

    这篇文章主要介绍了java利用时间格式生成唯一文件名的方法,需要的朋友可以参考下
    2017-01-01
  • Redisson 分布式延时队列 RedissonDelayedQueue 运行流程

    Redisson 分布式延时队列 RedissonDelayedQueue 运行流程

    这篇文章主要介绍了Redisson分布式延时队列 RedissonDelayedQueue运行流程,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • 关于Scanner对象的输入结束标记问题

    关于Scanner对象的输入结束标记问题

    这篇文章主要介绍了关于Scanner对象的输入结束标记问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05
  • Java上传文件进度条的实现方法(附demo源码下载)

    Java上传文件进度条的实现方法(附demo源码下载)

    这篇文章主要介绍了Java上传文件进度条的实现方法,可简单实现显示文件上传比特数及进度的功能,并附带demo源码供读者下载参考,需要的朋友可以参考下
    2015-12-12

最新评论