并发编程:线程同步工具:2、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 个人
开始会议...

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值