并发编程:CountDownLatch 等待N个并发事件(条件)
程序员文章站
2022-04-10 19:29:32
CountDownLatch 计数器锁 等待N个并发事件(条件)...
目录
CountDownLatch类介绍
Java并发API提供的类,它可以使N个线程等待直到一组(M个)操作完成,这个类实例化时候,需要传入整型参数M,该参数代表了线程希望等待的操作的个数。
当操作结束时,调用countDown()方法,该方法会使CountDownLatch对象的内部属性计数器的值减1,表示一个操作完成。当内部的操作数为0时,表示所有操作都完成,这时CountDownLatch对象将唤起所有因调用了其await()方法而休眠的线程。
主程序
package xyz.jangle.thread.test.n3_3.countdownlatch;
/**
* 3.3、等待N个并发事件(条件)
* CountDownLatch DEMO 简单的视频会议系统
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月9日 下午4:57:33
*
*/
public class M {
public static void main(String[] args) {
// 构造一个由10个人参加的会议(该对象内置CountDownLatch)
VideoConference conference = new VideoConference(10);
// 开始会议
new Thread(conference).start();
for (int i = 0; i < 10; i++) {
new Thread(new Participant(conference, "参会者" + i)).start();
}
}
}
会议类
package xyz.jangle.thread.test.n3_3.countdownlatch;
import java.util.concurrent.CountDownLatch;
/**
* 这是一个会议进程,它等待会议指定的人数到齐后开始会议。
*
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月9日 下午5:02:52
*
*/
public class VideoConference implements Runnable{
// 倒计数控制器(锁)
private final CountDownLatch controller;
public VideoConference(int num) {
super();
this.controller = new CountDownLatch(num);
}
/**
* 参会人员签到方法
* @param name 参会人员名称
*/
public void arrive(String name) {
System.out.printf("%s抵达,",name);
controller.countDown();
System.out.printf("还需要等待%d 个人\n",controller.getCount());
}
@Override
public void run() {
System.out.println("会议开始等待"+controller.getCount()+"个人员参加");
try {
controller.await();
System.out.println("开始会议...");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
参会者类
package xyz.jangle.thread.test.n3_3.countdownlatch;
import java.util.concurrent.TimeUnit;
/**
* 参会者类,它作为单独的线程,模拟参会者在随机时间后抵达会场进行签到。
* @author jangle
* @email jangle@jangle.xyz
* @time 2020年8月9日 下午5:19:05
*
*/
public class Participant implements Runnable {
// 会议对象
private VideoConference conference;
// 参会者名称
private String name;
public Participant(VideoConference conference, String name) {
super();
this.conference = conference;
this.name = name;
}
@Override
public void run() {
try {
TimeUnit.SECONDS.sleep((long) (Math.random() * 10));
} catch (InterruptedException e) {
e.printStackTrace();
}
// 在等待随机时间后进行签到
conference.arrive(name);
}
}
执行结果
会议开始等待10个人员参加
参会者8抵达,参会者3抵达,参会者7抵达,还需要等待8 个人
还需要等待7 个人
还需要等待9 个人
参会者1抵达,还需要等待6 个人
参会者0抵达,还需要等待5 个人
参会者9抵达,还需要等待4 个人
参会者6抵达,还需要等待3 个人
参会者5抵达,还需要等待2 个人
参会者2抵达,还需要等待1 个人
参会者4抵达,还需要等待0 个人
开始会议...
本文地址:https://blog.csdn.net/Bof_jangle/article/details/107897144