Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用
如题 (总结要点 ,看不懂下面有更多解释, 参考书籍《Java并发编程实战》)
- CountDownLatch 倒计数门闩器
- 让1-n-1个线程等待主线程完成工作。(Excel的多个Sheet的解析,最终等待解析完毕后;要实现主线程等待所有线程完成sheet解析操作,最简单的就是join )
常用API - CountDownLatch latch = new CountDownLatch(2); // 新建一个倒计数门闩器 ,常用于迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤
- latch.countDown(); // 计数器-1
- latch.await(1000, TimeUnit.MILLISECONDS); //阻塞当前线程(常为主线程),直到计数器变为0
区分- CyclicBarrier循环栅栏,维持最低的并发,让多个线程同时并发执行。每调用一次await()方法都将使阻塞的线程数+1,只有阻塞的线程数达到设定值时屏障才会打开,允许阻塞的所有线程继续执行。
适用场景总结
例子一
- 比如导出一份Excel, 共有10万行, 拆分出10K行 * 10个线程来解析(导入/导出)处理; 主线程来创建(或提交)任务并分配10个新线程来处理;
- 由于主线程分配完任务后就继续往下执行了, 其他的那10个新的线程还需要等待一段时间; 那这段时间差怎么处理??
- Excel的多个Sheet的解析,最终等待解析完毕后再进行汇总处理, 主线程需要进行汇总处理, 那么就使用
CountDownLatch 倒计数门闩器,来处理就很合理了.
例子二
- 需要分别统计 sort_id 为1-1万的某个表的字段数量, 使用多线程处理,调用10个线程并发统计,每个统计%K的范围; 倒计数门闩就很合适, 最后处理完了,主线程再进行处理/封装再返回.
- 依次类推
常用api
//构造器, 参数count为计数值
public CountDownLatch(int count) { };
//调用await()方法的线程会被挂起(一般是主线程),它会等待直到count值为0才继续执行
public void await() throws InterruptedException { };
//和await()类似,只不过等待一定的时间后count值还没变为0的话就会继续执行
public boolean await(long timeout, TimeUnit unit) throws InterruptedException { };
//将count值减1
public void countDown() { };
1.测试1 简单测试
public class Test03_countdownlatch {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
// 睡眠可以开启, Thread.sleep(1000L);
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
System.out.println("all thread finish");
}
}
2. 结果1 : 线程还没有来得及执行完毕,主线程就结束了(JVM关闭了),所以先打印的finish ; 如果子线程数量更多的话, 子线程就不一定能打印完.自己试试! 或者
all thread finish
hello
hello
3.测试2 迫使主线程通过子线程的join方法等待当前的子线程执行完毕
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("hello ");
}
};
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
thread1.start();
thread2.start();
try {
// 迫使主线程通过join方法等待当前的子线程执行完毕
thread1.join();
// 主线程第二次等待
thread2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish");
}
测试结果2
hello
hello
all thread finish
测试3 使用倒计数门闩器
public static void main(String[] args) {
Runnable runnable = () -> System.out.println("hello ");
Thread thread1 = new Thread(runnable);
Thread thread2 = new Thread(runnable);
// 使用倒计数门闩器 ,迫使主线程进入等待 ;设置N个结点 ,n个线程或者步骤都可以
CountDownLatch latch = new CountDownLatch(2);
thread1.start();
latch.countDown();
thread2.start();
latch.countDown();
try {
// 阻塞当前线程,直到计数器变为0; await(long time);也可以带时间!
latch.await(1000, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("all thread finish");
}
测试结果3
hello
hello
all thread finish
Java并发编程-JUC-CountDownLatch 倒计数门闩器-等待多线程完成再放行 -一次性使用的更多相关文章
- java并发编程_CountDownLanch(倒计数锁存器)应用场景
使用介绍: 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在 ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- Java并发编程:CountDownLatch、CyclicBarrier和Semaphore (总结)
下面对上面说的三个辅助类进行一个总结: 1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同: CountDownLatch一般用于某个线程A等待 ...
- 14、Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch ...
- 【转】Java并发编程:CountDownLatch、CyclicBarrier和Semaphore
Java并发编程:CountDownLatch.CyclicBarrier和Semaphore Java并发编程:CountDownLatch.CyclicBarrier和Semaphore 在j ...
- java并发编程JUC第九篇:CountDownLatch线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- java并发编程JUC第十篇:CyclicBarrier线程同步
在之前的文章中已经为大家介绍了java并发编程的工具:BlockingQueue接口.ArrayBlockingQueue.DelayQueue.LinkedBlockingQueue.Priorit ...
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore
原文出处: 海子 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅 ...
- Java并发编程:CountDownLatch、CyclicBarrier和 Semaphore[转]
[转载]http://www.cnblogs.com/dolphin0520/p/3920397.html 在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDow ...
随机推荐
- WebUploader 被 FormData 函数坑了,用了他的页面千万别定FormData变量
WebUploader 被 FormData 函数坑了,用了他的页面千万别定FormData变量 被这个坑了,页面中变量var FormData=null;后又为他赋了值,所有一直上传不了,也没有错 ...
- JavaScript 一些实用技巧
快速创建从0到n的数字 let arr1 = [...(new Array(n)).keys()]; let arr2 = Array.from({length:n},(v, k) => k); ...
- c# winFrom Close报错 System.ObjectDisposedException:“无法访问已释放的对象。
System.ObjectDisposedException:“无法访问已释放的对象. ObjectDisposed_ObjectName_Name” 查了一下发现是 InitializeCompon ...
- Xamarin.Android 6.0以后开启权限方法
Android 6.0 版本以上一些危险权限只能在运行的时候依次询问用户是否赋予,所以在开发的时候使用 RequestPermissions 方法单独请求所需要的权限. 代码: //开启相机权限 if ...
- 删除字符串中的字符(C语言)
题目: 编程序将给定字符串中指定字符删除.要求删除指定字符后原字符串不能留下空位置,字符串和指定字符均由键盘输入 基本思路 将字符串与要删除的字符进行比较,若为相同字符,则将字符串中的该字符替换为原字 ...
- HDU校赛 | 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 http://acm.hdu.edu.cn/contests/contest_show.php?cid=849 100 ...
- Linux学习笔记之详解linux软连接和硬链接
0x00 链接文件 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接. [软连接] 另外一种连接称之为符 ...
- C#读写修改设置调整UVC摄像头画面-清晰度
有时,我们需要在C#代码中对摄像头的清晰度进行读和写,并立即生效.如何实现呢? 建立基于SharpCamera的项目 首先,请根据之前的一篇博文 点击这里 中的说明,建立基于SharpCamera的摄 ...
- CodeForces 955D Scissors
昨晚CF比赛比较颓,今天有心情写题解就不错了QWQ 洛谷题目页面传送门 & CodeForces题目页面传送门 给定字符串\(a,b,|a|=n,|b|=m\),求是否可以在\(a\)中选\( ...
- python基础05day--函数
一 函数知识体系 什么是函数?为什么要用函数?函数的分类:内置函数与自定义函数如何自定义函数 语法 定义有参数函数,及有参函数的应用场景 定义无参数函数,及无参函数的应用场景 定义空函数,及空函数的应 ...