Java之CountDownLatch ---控制线程执行顺序
一,类介绍
这是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 ---控制线程执行顺序的更多相关文章
- 【Java多线程系列四】控制线程执行顺序
假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...
- Java多线程系列四——控制线程执行顺序
假设有线程1/线程2/线程3,线程3必须在线程1/线程2执行完成之后开始执行,有两种方式可实现 Thread类的join方法:使宿主线程阻塞指定时间或者直到寄生线程执行完毕 CountDownLatc ...
- gcd 控制线程执行顺序(供参考)
dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_qu ...
- 关于CountDownLatch控制线程的执行顺序
在上一篇文章中说过使用thread.join()方法.newSingleThreadExecutor单线程池来控制线程执行顺序.在文章的末尾我提出了一种构想,可否使用经典的生产者和消费者模型来控制执行 ...
- Android-Java控制多线程执行顺序
功能需求: Thread-0线程:打印 1 2 3 4 5 6 Thread-1线程:打印1 1 2 3 4 5 6 先看一个为实现(功能需求的案例) package android.java; // ...
- 转:java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例
java多线程CountDownLatch及线程池ThreadPoolExecutor/ExecutorService使用示例 1.CountDownLatch:一个同步工具类,它允许一个或多个线程一 ...
- Java:谈谈控制线程的几种办法
目录 Java:谈谈控制线程的几种办法 join() sleep() 守护线程 主要方法 需要注意 优先级 弃用三兄弟 stop() resume suspend 中断三兄弟 interrupt() ...
- java静态初始化块的执行顺序
先来观察下面的代码 package trr; class Root { static{ System.out.println("Root的静态初始化块"); } { System. ...
- 使用 CountDownLatch 控制多个线程执行顺序
已同步更新至:http://dxjia.cn/2015/08/countdownlatch-use/ 有时候会有这样的需求,多个线程同时工作,然后其中几个可以随意并发执行,但有一个线程需要等其他线程工 ...
随机推荐
- Fiddler使用总结一(使用Fiddler捕获手机所有http/https通信)
与后端数据通信是前端日常开发的重要一环,在与后端接口联调的时候往往需要通过查看后端返回的数据进行调试.如果在PC端,Chrome自带的DevTools就已经足够用了,Network面板可以记录所有网络 ...
- 【转】JAVA处理线程超时
在实际业务中,由其是多线程并开业务中,经常会遇到某个线程执行超时.而程序如果不捕获这类情况,就会导致程序一直处于等待状态,从而影响后续线程的运行.比如说网络通迅.单任务下的复杂数据库查询等,通常处理这 ...
- IDEA引MAVEN项目jar包依赖导入问题解决
Intellj 自动载入Mave依赖的功能很好用,但有时候会碰到问题,导致pom文件修改却没有触发自动重新载入的动作,此时需要手动强制更新依赖. 如下: 1手动删除Project Settings里面 ...
- intellij 打开node项目 一直停留在scanning files to index....,或跳出内存不够的提示框
说明: 在npm install 后,会出现Scanning files to index ...... 出现这个是正常的,但是一直不消失就不正常了.原因是npm install 后 node_mod ...
- list对象数组,xpath复杂定位校验,POST入参为number数组,POST入参为JSON对象数组
list对象数组: POST入参为number数组: { "typeIds":[1,2,3]} POST入参为JSON对象数组,举例: [{ "itemId& ...
- ASP.NET Core MVC请求超时设置解决方案
设置请求超时解决方案 当进行数据导入时,若导入数据比较大时此时在ASP.NET Core MVC会出现502 bad gateway请求超时情况(目前对于版本1.1有效,2.0未知),此时我们需要在项 ...
- iOS转场动画封装
写在前面 iOS在modal 或push等操作时有默认的转场动画,但有时候我们又需要特定的转场动画效果,从iOS7开始,苹果就提供了自定义转场的API,模态推送present和dismiss.导航控制 ...
- Gulp 的简单使用(原创)
1.安装nodejs 安装省略 npm的全称是Node Package Manager,是随同NodeJS一起安装的包管理和分发工具,它很方便让JavaScript开发者下载.安装.上传以及管理已经安 ...
- [Find the last digit when factorial of A divides factorial of B]
Given two numbers A and B. The task is to compute the last digit of the resulting F, where F= B! / A ...
- for 在项目实战中用的比较多
for循环编程语言中的语句之一,用于循环执行.for循环是开界的,它的一般形式为: for(; <条件表达式>; ) 语句: 初始化通常是一个赋值语句, 它用来给循环控制变量赋初值: 条件 ...