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!");
}
}
观察输出我们会发现,这个程序用与会人员的到场描述多个时间的发生,视频会议在多个时间发生后,继续执行他的逻辑部分。与这个类相似的
还有“栅栏”,但栅栏更强大些。