CountDownLatch类的使用,CountDownLatch是一个工具类,运行主线程开启子线程的时候,子线程还没有结束的时候,主线程可以一直等待,直到初始化的现成的计数器count为0,主线程就可以不用等待继续执行了。
注意:
count只能在实例化CountDownLatch类的时候初始化,没有其他的办法count注入值。
countDown方法,当前线程调用此方法,则计数在实例化CountDownLatch中传入的值基础上减一。
awaint方法,调用此方法会一直阻塞当前线程,不会向下执行,直到计时器的值为0的时候程序才会继续向下执行。
简单的使用示例:
import java.util.concurrent.CountDownLatch;
/**
* CountDownLatch的使用
* @author tyl
*
*/
public class Test {
private static final int count = 5;
public static void main(String[] args) throws InterruptedException {
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int i = 0; i < count; ++i) // create and start threads
{
new Thread(new Worker(countDownLatch,i)).start();
}
countDownLatch.await(); //阻塞线程,不继续往下执行
doLastSomething();
}
private static void doLastSomething() {
System.out.println("等待所有子线程完成之后继续做我需要做的事情");
}
static class Worker implements Runnable {
private CountDownLatch countDownLatch;
private int i;
public Worker( CountDownLatch doneSignal,int i) {
this.countDownLatch = doneSignal;
this.i=i;
}
public void run() {
try {
doWork();
} catch (Exception e) {
} finally {
countDownLatch.countDown();
}
}
private void doWork() {
System.out.println("创建子线程工作,开始工作.....,子线程ID为:"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}