天天看点

线程同步辅助类—CountDownLatch

CountDownLatch在包java.util.concurrent下,是一个“线程同步辅助类”,它的语义是:等待多个并发事件的完成!

下面我用程序描述下他的用法,程序的语义是这样的:

VideoConference是一个类,描述一场视频会议,Member是一个类,描述这场视频会议与会的人员,视频会议输出开始,此时等待所有的与会人员,

当所有的与会人员到达后,输出启动、会议结束。

package com.z;

import java.util.concurrent.CountDownLatch;

public class VideoConference{
	
	private CountDownLatch controller;
	
	public VideoConference(CountDownLatch controller){
		System.out.println("VideoConference is preparing,waiting group member...");
		this.controller = controller;
	}
	
	public void arrive(String name){
		System.out.println("VideoConference member:" + name + "arrived!");
		controller.countDown();
	}

	public void start(){
		try {
			controller.await();
		} catch (InterruptedException e) {
			System.out.println("VideoConference is interrpted :" + e);
		}
		System.out.println("VideoConference all member is arrived,now start!");
	}

	
	
}
           
package com.z;

import java.util.concurrent.CountDownLatch;

public class Member implements Runnable{
	
	private VideoConference vc;
	
	public Member(String name,VideoConference vc){
		Thread.currentThread().setName(name);
		this.vc = vc;
	}
	
	public void arrive(){
		vc.arrive(Thread.currentThread().getName());
		vc.start();
	}

	@Override
	public void run() {
		arrive();
	}
	
	public static void main(String[] args){
		int MEMBER_NUM = 100;
		CountDownLatch controller = new CountDownLatch(MEMBER_NUM);
		VideoConference conference = new VideoConference(controller);
		Member[] members = new Member[MEMBER_NUM];
		for(int i = 0; i < members.length; i ++){
			members[i] = new Member("member_" + i,conference);
			Thread member = new Thread(members[i]);
			member.start();
			//在这个地方join会产生死锁
			//应该是当member_0加入后,member_0等待闭锁的释放,而此时member_需要再次加入而不能
			//因此造成了死锁
//			try {
//				member.join();
//			} catch (InterruptedException e) {
//				System.out.println("member join() fail!" + e);
//			}
		}
		//所有member调用join并不能达到预期的输出顺序,但是
		//也要比不加来的更整齐
		for(int i = 0; i < members.length; i ++){
			Thread member = new Thread(members[i]);
			try {
				member.join();
			} catch (InterruptedException e) {
				System.out.println("member join() fail!" + e);
			}
		}
		
		System.out.println("VideoConference is end!");

	}
}
           

观察输出我们会发现,这个程序用与会人员的到场描述多个时间的发生,视频会议在多个时间发生后,继续执行他的逻辑部分。与这个类相似的

还有“栅栏”,但栅栏更强大些。