Java --CountDownLatch简介

CountDownLatch

1、类介绍

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await
方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。 一个线程(或者多个),
等待另外N个线程完成某个事情之后才能执行

2、使用场景


一些应用场合中,需要等待某个条件达到要求后才能做后面的事情;同时当线程都完成后也会触发事件,以便进行后面的操作。
这个时候就可以使用CountDownLatch。CountDownLatch最重要的方法是countDown()和await(),前者主要是倒数
一次,后者是等待倒数到0,如果没有到达0,就只有阻塞等待了。

3、方法说明

await

public boolean await(long timeout,
                     TimeUnit unit)
              throws InterruptedException
使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断或超出了指定的等待时间。如果当前计数为零,则此方法立刻返回 true 值。

如果当前计数大于零,则出于线程调度目的,将禁用当前线程,且在发生以下三种情况之一前,该线程将一直处于休眠状态:

countDown()

    方法,计数到达零;或者

  • 其他某个线程中断当前线程;或者
  • 已超出指定的等待时间。

如果计数到达零,则该方法返回 true 值。

  • 在进入此方法时已经设置了该线程的中断状态;或者
  • 在等待时被中断

InterruptedException,并且清除当前线程的已中断状态。如果超出了指定的等待时间,则返回值为 false。如果该时间小于等于零,则此方法根本不会等待。

参数:
timeout - 要等待的最长时间
unit - timeout 参数的时间单位。
返回:
如果计数到达零,则返回 true;如果在计数到达零之前超过了等待时间,则返回 false
抛出:
InterruptedException - 如果当前线程在等待时被中断

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class CountDownLatchTest {

    // 模拟了100米赛跑,10名选手已经准备就绪,只等裁判一声令下。当所有人都到达终点时,比赛结束。
    public static void main(String[] args) throws InterruptedException {

        // 开始的倒数锁
        final CountDownLatch begin = new CountDownLatch(1);

        // 结束的倒数锁
        final CountDownLatch end = new CountDownLatch(10);

        // 十名选手
        final ExecutorService exec = Executors.newFixedThreadPool(10);

        for (int index = 0; index < 10; index++) {
            final int NO = index + 1;
            Runnable run = new Runnable() {
                public void run() {
                    try {
                        // 如果当前计数为零,则此方法立即返回。
                        // 等待
                        begin.await();
                        Thread.sleep((long) (Math.random() * 10000));
                        System.out.println("No." + NO + " arrived");
                    } catch (InterruptedException e) {
                    } finally {
                        // 每个选手到达终点时,end就减一
                        end.countDown();
                    }
                }
            };
            exec.submit(run);
        }
        System.out.println("Game Start");
        // begin减一,开始游戏
        begin.countDown();
        // 等待end变为0,即所有选手到达终点
        end.await();
        System.out.println("Game Over");
        exec.shutdown();
    }

}

输出结果:

Game Start
No.7 arrived
No.5 arrived
No.9 arrived
No.4 arrived
No.8 arrived
No.2 arrived
No.3 arrived
No.6 arrived
No.1 arrived
No.10 arrived
Game Over

转载地址:http://www.itzhai.com/the-introduction-and-use-of-a-countdownlatch.html

时间: 2024-11-13 09:46:07

Java --CountDownLatch简介的相关文章

Java CountDownLatch解析(上)

写在前面的话 最近一直在边工作边学习分布式的东西,看到了构建Java中间件的基础知识,里面有提到Java多线程并发的工具类,例如ReentrantLock.CyclicBarrier.CountDownLatch... 以前在工作中也有用到过这些实用的工具类,但是了解不是特别深入,借此机会打个卡,好记性不如烂博客,哈哈哈... CountDownLatch简介 CountDownLatch顾名思义,count + down + latch = 计数 + 减 + 门闩(这么拆分也是便于记忆=_=)

java历史简介

java历史简介 Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 1991 年Sun公司的James Gosling等人开始开发名称为 Oak 的语言.希望用于控制嵌入在有线电视交换盒.PDA等的微处理器 1994年将Oak语言更名为Java 1998年JDK1.2时,更名为Java 2 Platform 分为标准版J2SE,企业版J2EE,微型版J2ME Java 既安全.可移植,又可跨平台,而且人们发现它能够解决Intern

Java IO简介

-------------siwuxie095 Java IO简介: IO 也写作"I/O",可理解为 In 和 Out,即 输入 与 输出 所以,IO体系的基本功能就是 读(取) 和 写(入) IO流(IO体系的核心 ) 作用:读写设备上的数据,硬盘文件.内存.键盘.网络数据- 根据数据的走向,可分为:输入流.输出流 根据处理的数据类型,可分为:字节流.字符流 字节流与字符流的区别: 字节流可以处理所有类型的数据,如MP3.图片.文字.视频等.在读取时, 读到一个字节就返回一个字节

Java SE 简介 &amp; 环境变量的配置

Java SE 简介 & 环境变量的配置 一.Java 技术的三个方向 Java 技术分为三个方向 javaSE( Java Platform Standard Edition 标准版)用来开发桌面应用程序,例如客户端.它是Java EE的基础,是java技术体系的核心: javaEE( Java Platform, Enterprise Edition,企业版)用来进行企业级应用开发.通常java EE包括JSP.Servlet.JDBC.XML等13种技术: javaME(Java Plat

Java知识简介与环境变量配置问题

一.在学习一门语言中,不仅需要掌握其语法结构,开发平台以及环境也是很重要的.在开始Java学习之前首先对其进行压缩包的下载安装,以及开发平台环境下载安装.基于此下面文章就此展开: 1.        下载并安装JDK包,然后进行快速正确安装操作.(具体安装步骤网上很多,不在赘述.) 2.        安装成功后,需要对其进行环境变量配置,这一点有点特别,特别针对C语言.C#语言开发的同学更应该注意. 环境变量配置步骤如下: 打开:计算机属性->高级->环境变量选项卡->系统变量->

Berkeley DB Java Edition 简介

一.             简介 Berkeley DB Java Edition (JE)是一个完全用JAVA写的,它适合于管理海量的,简单的数据. l         能够高效率的处理1到1百万条记录,制约JE数据库的往往是硬件系统,而不是JE本身. l         多线程支持,JE使用超时的方式来处理线程间的死琐问题. l         Database都采用简单的key/value对应的形式. l         事务支持. l         允许创建二级库.这样我们就可以方便

Java EE 简介

Java EE 简介 Java EE 基本架构 JavaEE 的诞生是为了解决传统 C/S 架构的弊端:客户端臃肿庞大,扩展性差等弊端. JavaEE 将传统的两层结构细分为了四层. 这四层分别是:Client 层, Web 层, Business 层, EIS 层 Java EE 客户端 Java EE客户端层可分为以下几种: Web 客户端,通常是浏览器呈现的网页,这种客户端成为轻量级客户端,因为他们不与数据库打交道,也没有执行业务上的复杂逻辑. Application 客户端,通常是用Sw

Java反射简介

Java反射简介 1.Class类 1) 在面向对象的世界里,万事万物皆对象.(java语言中,静态的成员.普通数据类型除外) 类是不是对象呢?类是(哪个类的对象呢?)谁的对象呢? 类是对象,类是java.lang.Class类的实例对象 2)这个对象到底如何表示 3 )Class.forName("类的全称") 不仅表示了,类的类类型,还代表了动态加载类 请大家区分编译.运行 编译时刻加载类是静态加载类.运行时刻加载类是动态加载类 4)基本的数据类型 void关键字 都存在类类型 5

Java scirpt简介

Java scirpt简介 学号:201631062509 姓名:杨菓 1.JavaScript 简介 JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. JavaScript 是脚本语言. JavaScript 是一种轻量级的编程语言. JavaScript 是可插入 HTM