CountDownLatch是java.util.concurrent下的另外一个多线程基本类,基本的用法是,当前线程或者多个线程可以等待多个其它线程完成时再开始做自己的事情,来看jdk1.6描述:
A synchronization aid that allows one or more threads to wait until a set of operations being performed in other threads completes.
就是jdk中给出的例子进行说明,我们设置两个CountDownLatch,一个用于主线程,另外一个用于多个其它子线程,我们目的是让主线程等待子线程完全执行完后,再进行收尾工作,java代码如下:
package cn.util.concurrent;
import java.util.concurrent.CountDownLatch;
/**
* java.util.CountDownLatch 进行测试
*
* @author snipper
* @created 2015年1月19日 下午3:52:52
*/
public class TestCountDownLatch {
public static void main(String[] args) {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(10);
for (int i = 0; i < 10; i++) {
new Thread(new Worker(startSignal, doneSignal, "snipper" + i)).start();
}
startSignal.countDown();//让所有线程的释放
try {
doneSignal.await();
System.out.println("OK"); //在最后执行
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
class Worker implements Runnable {
private CountDownLatch startSignal = null;
private CountDownLatch doneSignal = null;
private String name;
public Worker(CountDownLatch startSignal, CountDownLatch doneSignal , String name) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
this.name = name;
}
public void run() {
try {
this.startSignal.await();
doWork();
doneSignal.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void doWork() {
System.out.println(name + "doing work....");
}
}
运行结果:如下:
snipper8doing work....
snipper4doing work....
snipper1doing work....
snipper2doing work....
snipper0doing work....
snipper7doing work....
snipper9doing work....
snipper6doing work....
snipper5doing work....
snipper3doing work....
OK
可以看出,我们实现了我们的需求。