一、等待多个事件的完成CountDownLatch
1、CountDownLatch是一个同步辅助类。在完成一组其他线程中执行的操作之前,它允许线程一直等待
2、这个类使用一个整数进行初始化,这个整数就是线程要等待完成的操作的数目
3、当一个线程要等待某些操作先执行完时,需要调用await()方法,这个方法让线程进入休眠直到所有的操作都完成
4、当一个操作完成的时候,调用countDown()方法将CountDownLatch类的内部计数器减一。当计数器为0的时候,countDownLatch类将唤醒所有调用await()方法而进入休眠的线程
二、模拟视频会议系统,这个视频会议必须要等到所有的参会者到齐才开始
package com.concurrent.threadAvgClass; import java.util.concurrent.CountDownLatch; /** * 视频会议系统 * * @author Nicholas * */ public class VideoConference implements Runnable { private final CountDownLatch countDownLatch; public VideoConference(int number) { countDownLatch = new CountDownLatch(number); } /** * * @param name */ public void Arrive(String name) { System.out.println(name + " has Arraved ."); // 有一位参会者到场,等待的减一 countDownLatch.countDown(); // 打印未到的参与者 System.out.println("VideoConference : Waiting for " + countDownLatch.getCount() + " participants"); } @Override public void run() { // 打印初始的视频会议人数 System.out.printf( "VideoConference : Initialization : %d participants\n", countDownLatch.getCount()); try { countDownLatch.await(); System.out .println("VideoConference : All the participants have come"); } catch (InterruptedException e) { e.printStackTrace(); } } }
package com.concurrent.threadAvgClass; import java.util.concurrent.TimeUnit; public class Participant implements Runnable{ private VideoConference videoConference; private String name; public Participant(VideoConference videoConference, String name) { this.videoConference = videoConference; this.name = name; } @Override public void run() { long duration = (long) (Math.random()*10); try { TimeUnit.SECONDS.sleep(duration); } catch (InterruptedException e) { e.printStackTrace(); } //与会者到来 videoConference.Arrive(name); } }
测试// 十个人参与会议 VideoConference videoConference = new VideoConference(10); Thread threadVideoConference = new Thread(videoConference); threadVideoConference.start(); for (int i = 0; i < 10; i++) { Participant participant = new Participant(videoConference, "participant-" + i); Thread threadParticipant = new Thread(participant); threadParticipant.start(); }
打印结果
三、注意事项VideoConference : Initialization : 10 participants participant-8 has Arraved . participant-7 has Arraved . VideoConference : Waiting for 9 participants VideoConference : Waiting for 8 participants participant-4 has Arraved . VideoConference : Waiting for 7 participants participant-2 has Arraved . VideoConference : Waiting for 6 participants participant-6 has Arraved . participant-0 has Arraved . VideoConference : Waiting for 5 participants VideoConference : Waiting for 4 participants participant-5 has Arraved . VideoConference : Waiting for 3 participants participant-1 has Arraved . participant-3 has Arraved . VideoConference : Waiting for 1 participants VideoConference : Waiting for 2 participants participant-9 has Arraved . VideoConference : Waiting for 0 participants VideoConference : All the participants have come
1、CountDownLatch有三个基本的元素
- 一个初始值,定义必须等待的先行完成的操作的数目
- await()方法,需要等待其他事件先完成的线程调用
- countDown()方法,每个被等待的事件在完成时调用
2、当创建CountDownLatch对象时,使用构造器来初始化内部计数器。当countDown()方法被调用时,计数器减一。当计数器到达0时,CountDownLatch对象将唤醒所有的在await()方法上等待的线程3、CountDownLatch对象内部计数器被初始化之后就不能再次被初始化或者修改4、CountDownLatch机制不是用来保护临界区资源或者共享资源的,他是用来同步执行多个任务的一个或多个线程5、CountDownLatch只准许进入一次。

本文介绍CountDownLatch同步辅助类的应用,通过实例演示了如何利用CountDownLatch确保主线程等待其他线程完成特定任务后再继续执行,例如在模拟视频会议场景中等待所有参会者就绪。
445

被折叠的 条评论
为什么被折叠?



