博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程中的同步辅助类CountDownLatch
阅读量:6676 次
发布时间:2019-06-25

本文共 3262 字,大约阅读时间需要 10 分钟。

四个类可协助实现常见的专用同步语句。 是一个经典的并发工具。 是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。 是一个可重置的多路同步点,在某些并行编程风格中很有用。 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

 

一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。

 

等待其他线程:CountDownLatch(其实就是个倒序计数器)

         当其他线程完成之前,该类线程一直处于等待状态.

 

场景需求:

起点裁判倒计时....之后 运动员起跑,然后终点裁判发布成绩.

要让起点裁判线程优先执行.

老师开始给出了一个线程的join方法可以实现这个需求. t.join(); // 优先执行当前线程

但是join不好,因为如果t对应的线程不执行完,其他的所有线程都不会被执行到.

 

可以使用CountDownLatch.

final CountDownLatch cdl1 = new CountDownLatch(1);

刚开始让4个运动员线程处于等待状态,然后判断,有一个计数器int i = 1,裁判线程获得这个计数器.

裁判执行完对应的代码之后,把i变成0,如果运动员获得i=0,就开始执行.

 

要等到最后一个运动员线程执行完,终点裁判宣布成绩.

定义一个初始值是4的计数器,有个运动员到终点就减去1(cdl1.countDown();// 计数器减1).

 

cdl2.await();// 等待计数器变为0

 

CountDownLatchDemo.java

1 import java.util.Random; 2 import java.util.concurrent.CountDownLatch; 3 import java.util.concurrent.TimeUnit; 4  5 public class CountDownLatchDemo { 6  7     public static void main(String[] args) throws InterruptedException { 8         final CountDownLatch cdl1 = new CountDownLatch(1); 9         final CountDownLatch cdl2 = new CountDownLatch(4);10 11         // t.join(); // 优先执行当前线程12 13         for (int i = 0; i < 4; i++) {14             new Thread(new Runnable() {
// 运动员15 16 @Override17 public void run() {18 try {19 cdl1.await(); // 等待计数器变为020 21 System.out.println(Thread.currentThread()22 .getName() + " : 起跑");23 TimeUnit.SECONDS.sleep(new Random().nextInt(3));24 System.out.println(Thread.currentThread()25 .getName() + " : 到达终点!");26 cdl2.countDown();27 } catch (InterruptedException e) {28 e.printStackTrace();29 }30 }31 }).start();32 }33 34 Thread t = new Thread(new Runnable() {
// 发布命令的裁判35 36 @Override37 public void run() {38 System.out.println("准备");39 for (int i = 3; i >= 1; i--) {40 System.out.println(i + "...");41 try {42 TimeUnit.SECONDS.sleep(1);43 } catch (InterruptedException e) {44 e.printStackTrace();45 }46 }47 System.out.println("跑!");48 cdl1.countDown();// 计数器减149 50 }51 });52 t.start();53 54 new Thread(new Runnable() {
// 宣布成绩的裁判55 56 @Override57 public void run() {58 try {59 cdl2.await();// 等待计数器变为060 } catch (InterruptedException e) {61 e.printStackTrace();62 }63 System.out.println("宣布成绩!");64 }65 }).start();66 67 }68 }

 

本文转自SummerChill博客园博客,原文链接:http://www.cnblogs.com/DreamDrive/p/6206247.html,如需转载请自行联系原作者

你可能感兴趣的文章
Hive学习之Locking
查看>>
关于Lucene全文检索相关技术
查看>>
简单理解冒泡排序
查看>>
halcon算子翻译——fuzzy_measure_pairing
查看>>
Vertex and FragmentShader顶点与片段着色器
查看>>
Python体验(10)-图形界面之计算器
查看>>
debian9 开启rc.local服务
查看>>
Java时间日期格式转换
查看>>
304444数据库备份和恢复
查看>>
Unity3D 游戏开发应用篇——每日登陆(持久化类实现)
查看>>
Spring Security + OAuth系统环境搭建(一)
查看>>
在XenServer上更改Win7 64bit模板的内存
查看>>
二维数组和二维指针在CUDA中的应用
查看>>
二项式展开
查看>>
推荐系统-03-简单基于用户的推荐
查看>>
Android scaleType属性与ImagView中图片的显示的关系
查看>>
十、cent OS开启APR模式报错:configure: error: Found APR 1.3.9. You need version 1.4.3 or newer installed...
查看>>
八、阻塞等待异步结果FutureTask
查看>>
中文字符按拼音首字母排序(转)
查看>>
Supervision 行为模式
查看>>