java多线程之CountDownLatch倒数闸门
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
import java.util.concurrent.CountDownLatch;
/**
* create at 11-9-17
*
* @author KETQI
* @category CountDownLatch主要起倒计时计数器作用,它主要有两个方法await()和countDown()。
* 一旦某个线程调用await()方法,那么该线程就会阻塞,等待CountDownLatch计数器倒计时归零,
* 需要注意的是尽管线程调用await()方法后会阻塞,
* 但是CountDownLatch允许别的线程调用countDown()方法,将计数器减一。
* 也就是说调用计时器的线程阻塞后,可以利用别的线程控制调用线程何时从新开始运行。
* <p/>
* 该demo主要想要做的事就是:在主线程中创建N个子线程,让支线程等待主线程将开关计数器startSignal打开。
* 而当主线程打开startSignal开关后,主线程要等待计数器doneSignal归零,
* 而doneSignal计数器归零依赖于每个支线程为主线程的计数器减一。
* 所以当主线程打开开关后,支线程才能运行完毕,而只有支线程全部运行完毕,才能打开主线程的计数器。
* 这样整个程序才能走完
*/
public class CountDownLatchDemo {
public static final int N = 5 ;
public static void main(String[] args) throws InterruptedException {
// 用于向工作线程发送启动信号,由主线程调用
CountDownLatch startSignal = new CountDownLatch( 1 );
// 用于等待工作线程的结束信号,由子线程调用
CountDownLatch doneSignal = new CountDownLatch(N);
// 创建启动线程
System.out.println( "开始创建并运行分支线程,且分支线程启动startSignal计数器,等待主线程将startSignal计数器打开" );
for ( int i = 0 ; i < N; i++) {
new Thread( new LatchWorker(startSignal, doneSignal), "t" + i).start();
}
// 主线程,递减开始计数器,让所有线程开始工作
System.out.println( "主线程" + Thread.currentThread().getName() + "将startSignal计数器打开" );
startSignal.countDown();
// 主线程阻塞,等待所有线程完成
System.out.println( "主线程" + Thread.currentThread().getName() + "开始倒计时5个数" );
doneSignal.await();
/**
* 为什么说运行到下一句,所有线程就全部运行完毕了呢。 因为主线程要倒计时5个数, 而产生的5个支线程在运行完毕前会将主线程的计数器减一,
* 所以如果所有支线程运行完毕了 ,主线程才能继续运行主线程的最后一个打印程序
*/
System.out.println( "所有线程运行完毕" );
}
}
class LatchWorker implements Runnable {
// 用于等待启动信号
private final CountDownLatch startSignal;
// 用于发送结束信号
private final CountDownLatch doneSignal;
LatchWorker(CountDownLatch startSignal, CountDownLatch doneSignal) {
this .startSignal = startSignal;
this .doneSignal = doneSignal;
}
public void run() {
try {
// 一旦调用await()方法,该线程就会开始阻塞。知道计数器startSignal为0
System.out.println(Thread.currentThread().getName() + " 开始调用await()方法,等待计数器startSignal被主线程打开" );
startSignal.await();
doWork();
System.out.println(Thread.currentThread().getName() + " 将主线程的计数器减一" );
doneSignal.countDown(); // 发送完成信号
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
void doWork() {
System.out.println(Thread.currentThread().getName() + " 的计数器被打开,分支线程开始运行" );
try {
Thread.sleep(( long ) Math.random() * 10000 );
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
|
转载于:https://blog.51cto.com/ketqi/687565
java多线程之CountDownLatch倒数闸门相关推荐
- Java多线程之CountDownLatch用法
Java多线程之CountDownLatch用法 本文目录: CountDownLatch基本概念 CountDownLatch案例:6个同学陆续离开教室后班长才可以关门 CountDownLatch ...
- (十)java多线程之CountDownLatch
目录 引言 理论 例子 打赏 本人邮箱: kco1989@qq.com 欢迎转载,转载请注明网址 http://blog.csdn.net/tianshi_kco github: https://gi ...
- JAVA多线程之CountDownLatch
前序: 上周测试给开发的同事所开发的模块提出了一个bug,并且还是偶现. 经过仔细查看代码,发现是在业务中启用了多线程,2个线程同时跑,但是新启动的2个线程必须保证一个完成之后另一个再继续运行,才能消 ...
- 高级JAVA - 多线程之CountDownLatch
package com.xbz.thread.juc.countDownLatch;import java.util.concurrent.CountDownLatch;/*** @title Cou ...
- JAVA多线程之wait/notify
本文主要学习JAVA多线程中的 wait()方法 与 notify()/notifyAll()方法的用法. ①wait() 与 notify/notifyAll 方法必须在同步代码块中使用 ②wait ...
- Java多线程之Callable、Future和FutureTask
Java多线程之Callable接口 自己想总结一下的,看到一篇总结的更好的博客,就转载了,突然感觉真轻松,哈哈哈哈 文章转载于:Matrix海子:Java并发编程:Callable.Future和F ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java多线程之CAS缺点
Java多线程之CAS缺点 目录: 循环时间开销很大 只能保证一个共享变量的原子操作 引来ABA问题及解决方案(重点) 1. 循环时间开销很大 通过看源码,我们发现有个do while,如果CAS失败 ...
- Java多线程之CAS深入解析
Java多线程之CAS深入解析 目录: CAS是什么 CAS底层原理Unsafe深入解析 CAS缺点 引子:蚂蚁花呗一面:讲一讲AtomicInteger,为什么要用CAS而不是synchronize ...
最新文章
- GitHub:我开源我自己;CEO:不存在的
- hadoop学习--数据排序
- Java Web——文件下载getResourceAsStream()返回NULL解决方案
- java语言基本语法_Java语言基本语法
- 论文浅尝 - TACL2020 | TYDI QA:Google 发表一个多语言的问答语料库
- Linux命令整理 —— vi 和 vim 编辑器
- 2019年3月计算机ms二级考试题库,2019年3月全国计算机二级MSOffice章节练习题(2).doc...
- 中间件——构筑复杂分布式应用的关键技术(转)
- The game of life(生命游戏)新算法
- 浅析指针(pointer)与引用(reference)
- x = cos x 的解析形式
- Django | 静态文件处理
- 可以测试流放之路伤害的软件,流放之路:游戏难点!你知道平均每秒伤害(DPS)怎么计算吗!...
- ps放大素色图标(黑色特别有效)
- 阳历转阴历,阳历转中国农历
- Ext Gwt 实用例子--类似meebo的聊天界面
- r340服务器怎么接显示器,笔记本电脑如何连显示器_笔记本怎么链接显示器
- 手机连接电脑后,电脑上显示不出来手机的文件夹
- WIN10开机无限自动修复失败重启问题解决
- 宇信易诚 为何成长如此之快
热门文章
- Excel VBA(宏):添加宏
- Mahout实战---运行第一个推荐引擎
- Activity之间跳转的效果_overridePendingTransition
- mybatis_SQL映射(1)
- 协方差矩阵, 相关系数矩阵
- VS2010+matlab2012b环境下C++写MAT文件
- 继BAT之后 第四大巨头是谁
- C# winform窗体 ComboBox控件
- “没有找到iliertutil.dll,因此这个应用程序未能启动。”文件拷贝 PE 或者 dos...
- MFC多线程各种线程用法 .