令仔学多线程系列(一)----同步工具类CountDownLatch

简介: 简单介绍          简单的介绍下CountDownLatch,是在jdk1.5被引入的,是在java.util.concurrent包下,它允许一个或者多个线程一直等待,直到其他线程的操作执行完后再执行。
简单介绍

    
    简单的介绍下CountDownLatch,是在jdk1.5被引入的,是在java.util.concurrent包下,它允许一个或者多个线程一直等待,直到其他线程的操作执行完后再执行。
    
    CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量,下面代码中的count就是初始时设置的线程数量。也就是闭锁需要等待的线程数量。这个值只能被设置一次,而且CountDownLatch没有提供任何机制去重新设置这个计数值。

public CountDownLatch(int count) {...}

    CountDownLatch在主线程启动了设置的线程之后,需要立即调用CountDownLatch.await(),这样主线程的操作就会在这个地方阻塞,知道设置的线程完成各自的任务。

public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }

    有一点需要注意的就是,如果你给某一个东西上了锁,那么你怎么着也得有开锁的时候吧,CountDownLatch也可以当成一把锁来看,所以再每执行完一个线程之后,你都要去开一下锁,就是调用CountDownLatch.countDown()方法。

public void countDown() {
        sync.releaseShared(1);
    }

    目的就是为了你上了10把锁,每执行完一个任务就去解开一把锁,要不然就会一直锁着,线程就会一直阻塞在这个地方。countDown()方法就是开锁的,每调用一次这个方法,count值就会减一,直到为0,主线程就能通过await(),回复执行自己的任务。
    

举个应时的场景

    
    假如我是一个供货的中间代理商,我从供货商那里拿到货然后销售给平台。所有供应商的货物的报价在我这经过处理,每种物品选择一个最低的报价显示在平台上,薄利多销嘛。
这里写图片描述
    如果平台来了一个search请求,我总不能一个供货商一个供货商的去查询吧,查询供应商的数据库还需要时间的,而平台要求的search返回时间肯定不希望太长。而且我最终还有把查到的价格做处理,这些都是时间,时间就是Money。
    
    怎么办?在这里我可以应用CountDownLatch。
    上图中有五个供货商,就设置count数量为5,然后异步发送search请求消息,await一段时间(<平台要求的一次search返回时间),然后把所有的价格统计再进行后期处理。

final CountDownLatch countDownLatch = new CountDownLatch(5);
        for (int i=0;i<5;i++){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    //调用不同的供应商
                    countDownLatch.countDown();   //每new 一个Thread记得要减一。
                }
            }).start();
        }
        try {
            countDownLatch.await(10000, TimeUnit.MILLISECONDS);   //等待10秒(<小于平台要求的返回时间)
            //后续处理
        }catch (InterruptedException e){
            e.printStackTrace();
        }

    先简单的介绍到这里,后期会对CountDownLatch再做深入的研究。

相关文章
|
10天前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
14 0
|
10天前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
21 1
|
24天前
|
Java
Runnable+CountDownLatch多线程的等待和通知
Runnable+CountDownLatch多线程的等待和通知
12 3
|
26天前
|
Java
Java中,有两种主要的方式来创建和管理线程:`Thread`类和`Runnable`接口。
【6月更文挑战第24天】Java创建线程有两种方式:`Thread`类和`Runnable`接口。`Thread`直接继承受限于单继承,适合简单情况;`Runnable`实现接口可多继承,利于资源共享和任务复用。推荐使用`Runnable`以提高灵活性。启动线程需调用`start()`,`Thread`直接启动,`Runnable`需通过`Thread`实例启动。根据项目需求选择适当方式。
28 2
|
1月前
|
Java C++ 开发者
线程创建的终极对决:Thread 类 VS Runnable 接口,你站哪边?
【6月更文挑战第19天】在Java多线程编程中,通过`Thread`类直接继承或实现`Runnable`接口创建线程各有优劣。`Thread`方式简洁但不灵活,受限于Java单继承;`Runnable`更灵活,适合资源共享和多接口实现,提高代码可维护性。选择取决于项目需求和设计原则,需权衡利弊。
|
10天前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
17 0
|
10天前
|
设计模式 存储 缓存
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:结合单例模式与Java内存模型,设计一个线程安全的单例类?使用内存屏障与Java并发工具类,实现一个高效的并发缓存系统?结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
13 0
|
10天前
|
Java 开发者
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
Java面试题:解释Java内存模型中的内存可见性,解释Java中的线程池(ThreadPool)的工作原理,解释Java中的CountDownLatch和CyclicBarrier的区别
12 0
|
1月前
|
API
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
java-多线程-CountDownLatch(闭锁) CyclicBarrier(栅栏) Semaphore(信号量)-
18 1
|
17天前
|
安全 算法 Java
实现Java中的线程安全集合类
实现Java中的线程安全集合类