博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java CountDownLatch使用
阅读量:2430 次
发布时间:2019-05-10

本文共 2343 字,大约阅读时间需要 7 分钟。

概述

CountDownLatch是一个同步工具类,它允许一个或多个线程一直等待,直到其他线程的操作执行完后再执行。它的实现原理通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

CountDownLatch类位于java.util.concurrent包下,CountDownLatch提供1个有参构造器:

public CountDownLatch(int count) #count 表示闭锁线程需要等待的线程数,一旦被初始化不能修改。

CountDownLatch有两个重要的方法await和countDown方法。

  • await

    该方法用于阻塞主线程,直到其他线程将countdown减为0。

    public void await() throws InterruptedException public boolean await(long timeout, TimeUnit unit)

版本2提供了超时时间,当超时时间一到,主线程会继续往下执行。

  • countDown
    其它线程必须完成任务后必须调用countDown方法使countdown的计数减。

代码示例

举一个例子:

在主线程中启动5个子线程来执行20个任务,只有等任务全部完成后,主线程才能继续往下执行。

public class CountDownLatchTest {    private static final int threadcount = 5;    private  static final CountDownLatch countdown = new CountDownLatch(threadcount);    public static void main(String[] args) throws InterruptedException {        ExecutorService executor = Executors.newCachedThreadPool();        for (int i = 0; i < threadcount ; ++i) {            executor.submit(new CountDownThread(countdown, i));        }        countdown.await();        System.out.println("5个子任务执行完毕,主线程继续执行");        executor.shutdownNow();    }}class CountDownThread implements Runnable {    private CountDownLatch countdown;    private int i;    public CountDownThread(CountDownLatch countdown, int i) {        this.countdown = countdown;        this.i = i;    }    @Override    public void run() {        try {            Thread.sleep(1000);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("任务" + i + "执行完毕");        countdown.countDown();    }}

运行结果:

任务0执行完毕任务1执行完毕任务2执行完毕任务4执行完毕任务3执行完毕5个子任务执行完毕,主线程继续执行

考虑下面的场景:

在主线程中启动5个子线程来执行20个任务,主线程不会等到所有的线程执行完,当过了超时时间它就会继续往下执行。

可以在上面await()处加上超时时间。

countdown.await(500, TimeUnit.MILLISECONDS);

执行结果:

5个子任务执行完毕,主线程继续执行任务4执行完毕任务1执行完毕任务2执行完毕任务3执行完毕任务0执行完毕
对比

下面两段话是从源代码注释中摘录出来的:

CountDownLatch: A synchronization aid that allows one or more threads

to wait until a set of operations being performed in other threads completes.

CyclicBarrier: A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.

从设计目的上来看:

  • CountDownLatch:一个或者多个线程,等待其他多个线程完成某件事情之后才能执行。
  • CyclicBarrier:多个线程互相等待,直到到达同一个同步点,再继续一起执行。

从使用上来看:

  • CountDownLatch:一般当做计数器使用,只能使用一次。
  • CyclicBarrier:CyclicBarrier的计数器提供reset功能,可以多次使用。

转载地址:http://gwjmb.baihongyu.com/

你可能感兴趣的文章
苹果遭集体诉讼;华为或年底推出鸿蒙系统中低端智能手机;Facebook雇人记录用户语音通话以改善AI技术……...
查看>>
云化要求下,数据库架构如何演进?
查看>>
5G精华问答 | 5G关键技术解读
查看>>
10个业界最流行的Kubernetes发行版
查看>>
微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...
查看>>
如何证明你不是在开发垃圾?
查看>>
微服务精华问答 | 为什么需要微服务?
查看>>
当我们谈AI时,到底该谈什么?
查看>>
kafka系统设计开篇
查看>>
2019全球编程语言高薪排行榜登场;余承东正式宣布华为IFA2019 或发布麒麟990;OPPO、vivo和小米成立互传联盟…...
查看>>
虚拟化精华问答 | 虚拟化技术分类
查看>>
面向过程语言和面向对象语言的差别:
查看>>
【c语言】基本数据数据类型回顾
查看>>
【c语言】写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1
查看>>
【C语言】【编程练习】字符大小写问题
查看>>
【C语言】【编程练习】判断100到200之间的素数
查看>>
【C语言】将数组A中的内容和数组B中的内容进行交换。(数组一样大)
查看>>
【C语言】实现一个简单小游戏-三子棋
查看>>
【C语言】c语言程序编译运行过程;静态链接,动态链接;
查看>>
【C语言】数据在计算机中的存储与运算
查看>>