欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

并发编程:CountDownLatch 等待N个并发事件(条件)

程序员文章站 2022-04-10 19:29:32
CountDownLatch 计数器锁 等待N个并发事件(条件)...

目录

CountDownLatch类介绍

主程序

会议类

参会者

执行结果



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