美文网首页
理解CountDownLatch

理解CountDownLatch

作者: 饿了爸 | 来源:发表于2019-09-28 17:05 被阅读0次

    1. CountDownLatch是什么

    CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行
    ,必要时可以对各个任务的执行结果进行汇总,然后主线程才继续往下执行。常被用在多线程环境下,它在初始时需要指定一个计数器的大小,然后可被多个线程并发的实现减 1 操作,并在计数器为 0 后调用 await 方法的线程被唤醒,从而实现多线程间的协作

    2 适用场景

    CountDownLatch非常适合于对任务进行拆分,使其并行执行,比如某个任务执行2s,其对数据的请求可以分为五个部分,那么就可以将这个任务拆分为5个子任务,分别交由五个线程执行,执行完成之后再由主线程进行汇总,此时,总的执行时间将决定于执行最慢的任务,平均来看,还是大大减少了总的执行时间。
    另外一种比较合适使用CountDownLatch的地方是使用某些外部链接请求数据的时候,比如图片。在本人所从事的项目中就有类似的情况,因为我们使用的图片服务只提供了获取单个图片的功能,而每次获取图片的时间不等,一般都需要1.5s~2s。当我们需要批量获取图片的时候,比如列表页需要展示一系列的图片,如果使用单个线程顺序获取,那么等待时间将会极长,此时我们就可以使用CountDownLatch对获取图片的操作进行拆分,并行的获取图片,这样也就缩短了总的获取时间

    3 原理

    采用AQS实现,参见https://www.infoq.cn/article/java8-abstractqueuedsynchronizer/

    4 应用实列

        static CountDownLatch c = new CountDownLatch(3);
        public static void main(String[] args) throws InterruptedException {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println(1);
                    c.countDown();
                    System.out.println(2);
                    c.countDown();
                }
    
            }).start();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(3);
                    c.countDown();
                }
    
            }).start();
            c.await();
            System.out.println("over");
        }
    

    调用一次CountDownLatch的countDown方法时,N就会减1,CountDownLatch的await会阻塞当前线程,直到N变成零。由于countDown方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是1个线程里的N个执行步骤。用在多个线程时,你只需要把这个CountDownLatch的引用传递到线程

    5 总结

    • CountDownLatch 可以用Thread.join 实现

    相关文章

      网友评论

          本文标题:理解CountDownLatch

          本文链接:https://www.haomeiwen.com/subject/bxjzectx.html