CountDownLatch——闭锁的实现之一
CountDownLatch实际上是一种闭锁实现。闭锁:是一种同步工具类,可以延迟线程的进度直到其到达终止状态——《Java并发编程实战》。这个怎么解释呢?简单来说,就是有1个线程需要等待其余10个线程都执行完毕后再执行,这个时候就可以使用闭锁,也即CountDownLatch(当然闭锁的实现并不止这一种)。关于对闭锁的详细解释请参考《Java并发编程实战》P79。
CountDownLatch中有一个计数器,该计数器通过构造方法传递,表示需要完成的工作。有两个主要的方法:countDown——表示计数器减1,再完成一个工作时调用此方法。await——表示唤醒,等待线程在执行方法前调用此方法,当计数器未为0(即还有工作尚未完成)时,被阻塞,当所有工作都已完成,计数器被减至0,此时等待线程才被唤醒以继续执行。
我们通过代码来实际感受一下CountDownLatch类API的使用。
首先有一个TaskThread任务线程,表示做好准备工作的线程。
package countdownlatch; import java.util.concurrent.CountDownLatch; /**
* Created by yulinfeng on 12/14/16.
*/
public class TaskThread implements Runnable {
private final CountDownLatch latch; public TaskThread(CountDownLatch latch){
this.latch = latch;
} @Override
public void run() {
try {
doWork();
latch.countDown(); //线程执行完这部分工作后,CountDownLatch的计数减1。
} catch (InterruptedException e) {
e.printStackTrace();
}
} private void doWork() throws InterruptedException{
System.out.println(Thread.currentThread().getName());
Thread.sleep(2000); //休眠2s,模拟这部分工作的完成
}
}
接着是等待线程,即当所有的TaskThread完成各自的工作之后再执行此线程。
package countdownlatch; import java.util.concurrent.CountDownLatch; /**
* Created by yulinfeng on 12/14/16.
*/
public class WaitThread implements Runnable{
private final CountDownLatch latch; public WaitThread(CountDownLatch latch){
this.latch = latch;
} @Override
public void run() {
try {
System.out.println("Wait for other threads to execute!"); //就算CPU在未完成所有TaskThread进入到次线程,该线程也会因为CountDownLatch计数器未减至0而阻塞。
latch.await(); //直到CountDownLatch的计数器减至0(即表示所有的工作也完成)才继续执行,否则阻塞。
System.out.println("Other threads have already completed!");
} catch (InterruptedException e) {
e.printStackTrace();
} }
}
测试代码:
package countdownlatch; import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; /**
* Created by yulinfeng on 12/14/16.
*/
public class Test { public static void main(String[] args){
ExecutorService exec = Executors.newCachedThreadPool();
CountDownLatch latch = new CountDownLatch(100); //所有线程必须共享一个CountDownLatch单例(这也是在另外两个线程中CountDownLatch定义为final不可变引用的原因),模拟有100个工作待完成。 exec.execute(new WaitThread(latch)); //等待线程
for (int i = 0; i < 100; i++){
exec.execute(new TaskThread(latch)); //开启100个线程,模拟完成100个工作。
} exec.shutdown();
}
}
执行结果很好的诠释了CountDownLatch:


CountDownLatch——闭锁的实现之一的更多相关文章
- 6. CountDownLatch 闭锁
package com.gf.demo05; import java.util.concurrent.CountDownLatch; /** * CountDownLatch : 闭锁,在完成某些操作 ...
- juc并发工具类之CountDownLatch闭锁
import java.util.concurrent.CountDownLatch; /** * 闭锁: 在进行某些运算时, 只有其他所有线程的运算全部完成,当前运算才继续执行(程序流中加了一道栅栏 ...
- 同步机制之--java之CountDownLatch闭锁
CountDownLatch闭锁 1.类介绍 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待.用给定的计数初始化 CountDownLatch.CountDown ...
- CountDownLatch闭锁
CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 闭锁可以延迟线程的进度直到其到达终止状态,闭锁可以用来确保某些活动直到其他活动都完 ...
- 【同步工具类】CountDownLatch闭锁任务同步
[同步工具类]CountDownLatch闭锁任务同步 转载:https://www.cnblogs.com/yangchongxing/p/9214284.html 打过dota的同学都知道,多人一 ...
- CopyOnWriteArrayList(写入并复制) & CountDownLatch(闭锁)
ConcurrentHashMap: ①Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能.② ConcurrentHashMap 同步容器 ...
- CountDownLatch(闭锁)
一.闭锁(Latch) 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都 ...
- CountDownLatch 闭锁、FutureTask、Semaphore信号量、Barrier栅栏
同步工具类可以是任何一个对象.阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore).栅栏(Barrier).以及闭锁(Latch). 所有的同步工具类都包含一些特定的结构 ...
- Java并发编程笔记之 CountDownLatch闭锁的源码分析
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountD ...
随机推荐
- 老李分享:jvm内存原型剖析
老李分享:jvm内存原型剖析 poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq:9088214 ...
- Java并发编程:线程的基本状态
一.线程的基本状态 线程基本上有5种状态,分别是:NEW.Runnable.Running.Blocked.Dead. 1)新建状态(New) 当线程对象对创建后,即进入了新建状态,如:Thread ...
- PHP对象相关知识点的总结
对象传递:一种说法是"PHP对象是通过引用传递的",更准确的说法是别名(标识符)传递,即它们都保存着同一个标识符(ID)的拷贝,这个标识符指向同一个对象的真正内容. <?ph ...
- 关于mysql的初步学习
1.在windows上使用CMD链接数据库 这是原始用户表 users 这是通过 语句插入而来的 user表和user2表结构相同 user2 的数据 通过如下SQL语句从users表赋值过来: in ...
- css3 loading动画 三个省略号
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- ios url网址相关问题解说
问题1:ios网址中存在汉字的情况,需要GB_18030_2000编码方法如下: // 汉字转编码 + (NSString *)changeChineseWithEncodingGB_18030_20 ...
- 自动生成数学题型三 (框架Struts2)题型如 a+b=c(a、b、c都为分数)
1. 约分分数 1.1 保留质数 /** * 将数值放入到fraction数组中 * @param fen 简要放的 int类型数值 */ public void fenshu(int fen) { ...
- MongoDB基础教程系列--第九篇 MongoDB 分片
1.分片介绍 分片(sharding)是将数据拆分,将其分散存到不同机器上的过程.MongoDB 支持自动分片,可以使数据库架构对应用程序不可见.对于应用程序来说,好像始终在使用一个单机的 Mongo ...
- Java泛型知识点:泛型类、泛型接口和泛型方法
有许多原因促成了泛型的出现,而最引人注意的一个原因,就是为了创建容器类. 泛型类 容器类应该算得上最具重用性的类库之一.先来看一个没有泛型的情况下的容器类如何定义: public class Cont ...
- python 错误之SyntaxError: Missing parentheses in call to 'print'
SyntaxError: Missing parentheses in call to 'print' 由于python的版本差异,造成的错误. python2: print "hello ...