一,类介绍

这是java.util.concurrent包里的一个同步辅助类,它有两个主要的常用方法  countDown()方法以及await()方法。在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

这个类可以帮助我们做什么事呢?

二,实例运行

列举一个场景,三个人赛跑,哨声一响同时出发,跑到一半时A选手突然觉得拿名次没什么意思,当最后一名也挺好,然后他就让B,C先跑到终点,然后自己再跑。

这里我们可以开三个线程模拟三位选手,看看我们怎么通过这两个重要方法来实现A选手的想法的。

代码如下,不妨先复制一下,跑起来再说。

public class Sample {

        /**
* 计数器,用来控制线程
* 传入参数2,表示计数器计数为2
*/
private final static CountDownLatch mCountDownLatch = new CountDownLatch(2); /**
* A线程类
*/
private static class ThreadA extends Thread { @Override
public void run() {
System.out.println("A选手 出发!");
try {
// 会阻塞在这里等待 mCountDownLatch 里的count变为0;
// 也就是等待另外的WorkingThread调用countDown()
mCountDownLatch.await();
} catch (InterruptedException e) { }
System.out.println("A选手 到终点拉!");
}
} /**
* BC线程类
*/
private static class WorkingThread extends Thread {
private final String mThreadName;
private final int mSleepTime;
public WorkingThread(String name, int sleepTime) {
mThreadName = name;
mSleepTime = sleepTime;
} @Override public void run() {
System.out.println("[" + mThreadName + "] 出发!");
try {
Thread.sleep(mSleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
} System.out.println("[" + mThreadName + "] 到终点拉!");
mCountDownLatch.countDown();
}
} public static void main(String[] args) throws Exception {
// 最先run ThreadA
new ThreadA().start(); new WorkingThread("B选手", 2000).start(); new WorkingThread("C选手", 2000).start(); } }

三,代码分析

现在我们来分析一下代码,我们先开启了A线程,它先跑了,但是在A线程的run方法中,调用了await()方法,这个方法可以让当前线程处于等待状态,直到计数器为0时,才继续往下执行。

好了计数器是什么东西,其实CountDownLatch这个类我们就可以把它看出一个计数器,实际上它内部也真实维护了一个count计数,对计数的操作都是原子的,啰嗦一句,原子操作的意思

就是当一个线程对count进行修改时,其他的线程是不可以同时修改的。上面说到要等到计数器为0才行,显然想让它为0,就得有个初始值,然后再有减的操作才行吧。赋初始值的操作,就是new这

个对象的时候就完成拉,代码中 new CountDownLatch(2) 就是给count设为2的操作,然后mCountDownLatch.countDown()这个方法就是count减去1的操作,代码我们减了两次,为0之后,A选手才继续跑完。

好了,这样的栗子好像只能帮助理解,但是挑不起兴趣,再举一个工作中真实用到的场景。

开启多个线程分块下载一个大文件,每个线程只下载固定的一截,最后由另外一个线程来拼接所有的分段,那么这时候我们可以考虑使用CountDownLatch来控制并发,使得拼接的线程放在最后执行。

Java之CountDownLatch ---控制线程执行顺序的更多相关文章

  1. 【Java多线程系列四】控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  2. Java多线程系列四——控制线程执行顺序

    假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...

  3. gcd 控制线程执行顺序(供参考)

    dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_qu ...

  4. 关于CountDownLatch控制线程的执行顺序

    在上一篇文章中说过使用thread.join()方法.newSingleThreadExecutor单线程池来控制线程执行顺序.在文章的末尾我提出了一种构想,可否使用经典的生产者和消费者模型来控制执行 ...

  5. Android-Java控制多线程执行顺序

    功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...

  6. 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例

    java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...

  7. Java:谈谈控制线程的几种办法

    目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...

  8. java静态初始化块的执行顺序

    先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...

  9. 使用 CountDownLatch 控制多个线程执行顺序

    已同步更新至:http://dxjia.cn/2015/08/countdownlatch-use/ 有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工 ...

随机推荐

  1. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router

    路由koa-router--MVC 中重要的环节:Url 处理器

  2. 微信小程序的Web API接口设计及常见接口实现

    微信小程序给我们提供了一个很好的开发平台,可以用于展现各种数据和实现丰富的功能,通过小程序的请求Web API 平台获取JSON数据后,可以在小程序界面上进行数据的动态展示.在数据的关键 一环中,我们 ...

  3. ASP.NET Core 返回 Json DateTime 格式

    ASP.NET Core 返回 Json 格式的时候,如果返回数据中有DateTime类型,如何自定义其格式呢?配置如下: services.AddMvc().AddJsonOptions(opt = ...

  4. mysql中对字符集和校对规则的认识

    字符集:指符号和字符编码的集合.校对规则:比较字符编码的方式.GBK2312:主要包括简体中文字符及常用符号,对于中文字符采用双字节编码的格式,也就是说一个汉字字符在存储占两个字节.GBK:包括有中. ...

  5. GET请求/百度贴吧 有bug

    # -*- coding:utf-8 -*- import urllib, urllib2 import re import sys class Cuzz(): """这 ...

  6. 【java】工厂模式Factory,利用反射改进

    package 反射; interface Product{ public void produce(); } class socks implements Product{ @Override pu ...

  7. Java之数据类型,变量赋值

    Java中的基础数据类型(四类八种): 1.整数型 byte----使用byte关键字来定义byte型变量,可以一次定义多个变量并对其进行赋值,也可以不进行赋值.byte型是整型中所分配的内存空间是最 ...

  8. 637. Average of Levels in Binary Tree

    Given a non-empty binary tree, return the average value of the nodes on each level in the form of an ...

  9. DOM&JavaScript示例&练习

    以下示例均为html文件,保存至本地就可直接用浏览器打开以查看效果\(^o^)/~ 练习一:设置新闻字体 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTM ...

  10. gitlab 接入 openldap、AD

    =============================================== 20171009_第2次修改                       ccb_warlock === ...