java并发-CountDownLatch使用
2023-12-14 21:47:59
CountDownLatch使用
介绍
它是 JDK 提供的并发流程控制的工具类,它是在 java.util.concurrent
包下,在 JDK1.5 以后加入的。
使用场景
比如我们去游乐园坐激流勇进,有的时候游乐园里人不是那么多,这时,管理员会让你稍等一下,等人
坐满了再开船,这样的话可以在一定程度上节约游乐园的成本。座位有多少,就需要等多少人,这就是
CountDownLatch
的核心思想,等到一个设定的数值达到之后,才能出发。
于是入下流程图
可以看到,最开始 CountDownLatch
设置的初始值为 3,然后 T0 线程上来就调用 await
方法,它的作
用是让这个线程开始等待,等待后面的 T1、T2、T3,它们每一次调用 countDown
方法,3 这个数值
就会减 1,也就是从 3 减到 2,从 2 减到 1,从 1 减到 0,一旦减到 0 之后,这个 T0 就相当于达到了
自己触发继续运行的条件,于是它就恢复运行了。
主要方法说明
- 构造函数:
public CountDownLatch(int count) { };
count是需要倒数的值。 await()
:调用 await() 方法的线程开始等待,直到倒数结束,也就是 count 值为 0 的时候才会继。await(long timeout, TimeUnit unit):``await()
有一个重载的方法,里面会传入超时参数,这个方法的作用和await()
类似,但是这里可以设置超时时间,如果超时就不再等待了。countDown()
:把数值倒数 1,也就是将 count 值减 1,直到减为 0 时,之前等待的线程会被唤起。
示例
一个线程等待其他多个线程都执行完毕,再继续自己的工作
public class RunDemo1 {
public static void main(String[] args) throws InterruptedException {
CountDownLatch latch = new CountDownLatch(5);
ExecutorService service = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
final int no = i + 1;
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long) (Math.random() * 10000));
System.out.println(no + "号运动员完成了比赛。");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}
};
service.submit(runnable);
}
System.out.println("等待5个运动员都跑完.....");
latch.await();
System.out.println("所有人都跑完了,比赛结束。");
}
}
执行结果:
等待5个运动员都跑完.....
4号运动员完成了比赛。
3号运动员完成了比赛。
1号运动员完成了比赛。
5号运动员完成了比赛。
2号运动员完成了比赛。
所有人都跑完了,比赛结束。
多个线程等待某一个线程的信号,同时开始执行
public class RunDemo2 {
public static void main(String[] args) throws InterruptedException {
System.out.println("运动员有5秒的准备时间");
CountDownLatch countDownLatch = new CountDownLatch(1);
ExecutorService service = Executors.newFixedThreadPool(5);
for (int i = 0; i < 5; i++) {
final int no = i + 1;
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println(no + "号运动员准备完毕,等待裁判员的发令枪");
try {
countDownLatch.await();
System.out.println(no + "号运动员开始跑步了");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
service.submit(runnable);
}
Thread.sleep(5000);
System.out.println("5秒准备时间已过,发令枪响,比赛开始!");
countDownLatch.countDown();
}
}
运行结果:
运动员有5秒的准备时间
2号运动员准备完毕,等待裁判员的发令枪
1号运动员准备完毕,等待裁判员的发令枪
3号运动员准备完毕,等待裁判员的发令枪
4号运动员准备完毕,等待裁判员的发令枪
5号运动员准备完毕,等待裁判员的发令枪
5秒准备时间已过,发令枪响,比赛开始!
2号运动员开始跑步了
1号运动员开始跑步了
5号运动员开始跑步了
4号运动员开始跑步了
3号运动员开始跑步了
总结
CountDownLatch
在构造函数中传入倒数次数,在await
方法开始等待,countDown
方法之后,计数便会减 1,直到减为 0时,之前等待的线程便会继续运行。
文章来源:https://blog.csdn.net/qq_36649893/article/details/135004213
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!