CountDownLatch--一组线程完成后其他线程才执行(一)
来源:互联网 发布:移植术后软件 编辑:程序博客网 时间:2024/06/05 04:18
问题背景:
问题一:
java多线程,A、B、C、D统计4个盘大小,统计完后第5个人汇总。
问题二:
比如一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有团队成员跑完,方可计算总成绩。
java.util.concurrent.CountDownLatch
你可以向 CountDownLatch 对象设置一个初始计数值,任何在这个对象上调用 await() 的方法都将阻塞,直到这个计数值为0。其他任务在结束其工作时,可以在该对象上调用 countDown() 来减小这个数值,这个方法不会阻塞线程。 CountDownLatch 被设计为只触发一次,计数值不能被重置。如果你需要能够重置计数值的版本,则可以使用 CyclicBarrier .
CountDownLatch 的典型用法时将一个程序分成n个互相独立的可解决任务,并创建值为n的CountDownLatch。每当任务完成时,都会在这个锁存储器上调用countDown()方法。等待问题被解决的任务在这个锁存储器上调用await()。将它们自己拦住,直到存储器计数结束。
示例1:通用代码示例
import java.util.concurrent.CountDownLatch;/** * 比如一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有 * 团队成员跑完,方可计算总成绩。 * * 题目2:统计4个盘子的大小,统计完后交给第五个人汇总 */public class CountDownLatchTest {public static void main(String[] args) throws InterruptedException {CountDownLatch startSignal = new CountDownLatch(1);CountDownLatch doneSignal = new CountDownLatch(4);//四个人赛跑,这4个可以写一个for循环new Thread(new Worker(startSignal, doneSignal)).start();new Thread(new Worker(startSignal, doneSignal)).start();new Thread(new Worker(startSignal, doneSignal)).start();new Thread(new Worker(startSignal, doneSignal)).start();System.out.println("这里放计数前自己的代码...");//由于startSignal是1,上边的4个线程还不能执行startSignal.countDown(); // startSignal=0,线程可以开始执行了//doSomethingElse();System.out.println("计数后的代码...这是主线程...和上边4个线程混在一起的...");doneSignal.await(); // 判断上边4个是否执行完了,如果是,则允许下边的代码执行//开始执行另外一个任务System.out.println("开始执行其他任务...");}}
class Worker implements Runnable {private final CountDownLatch startSignal;private final CountDownLatch doneSignal;Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {this.startSignal = startSignal;this.doneSignal = doneSignal;}@Overridepublic void run() {try {startSignal.await(); //startSignal的计数到0了吗?到0了,才能执行doWork();doneSignal.countDown();} catch (InterruptedException ex) {} }void doWork() {System.out.println("正在统计中...");}}
//结果这里放计数前自己的代码...计数后的代码...这是主线程...和上边4个线程混在一起的...正在统计中...正在统计中...正在统计中...正在统计中...开始执行其他任务...
阅读全文
0 0
- CountDownLatch--一组线程完成后其他线程才执行(一)
- CountDownLatch--一组线程完成后其他线程才执行(二)
- CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
- JAVA多线程—CountDownLatch-一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
- 如何等待一个线程完成后才继续执行之后的操作
- Java多线程执行,主程序等待其他线程执行完成
- CountDownLatch控制线程执行顺序
- java线程中CyclicBarrier的使用—实现一组线程“集齐”后,再进行其他操作
- java并发(一) CountDownLatch (在多个线程都结束后再去执行某个任务)
- java线程池中任务执行完成后再次执行
- CountDownLatch 控制多线程 让多个线程执行完后再依次做其他的
- CountDownLatch使用countDown方法来触发其他等待线程再执行的问题
- Java线程基础-CountDownLatch-批量执行多线程完成,再由主线程发起
- CountDownLatch--控制三个线程执行顺序(三)
- 主线程等待所有子线程完成后再执行
- C#多线程之所有线程执行完成后
- 线程CountDownLatch
- CountDownLatch 控制多个线程执行顺序
- Android根据系统意图安装apk
- 关于File文件类的使用:
- 《Ray Tracing in One Weekend》——Chapter 11: Defocus Blur
- Codeforces Round #415 (Div. 2)A. Straight «A» (暴力)
- UserWarning: No parser was explicitly specified
- CountDownLatch--一组线程完成后其他线程才执行(一)
- Android自定义可标记日历
- Qt标准对话框之进度对话框(QProgressDialog)
- 习题
- 存储过程中的循环加判断
- 函数的调用过程(栈帧的创建和销毁)
- My-Blog搭建过程:如何让一个网站从零到可以上线访问
- JS 错误处理
- Codeforces Round #415 (Div. 2)-C. Do you want a date?