主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
例子
-
public class CountDownLatchDemo {
-
final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
public static void main(String[] args) throws InterruptedException {
-
CountDownLatch latch=new CountDownLatch(2);//两个工人的协作
-
Worker worker1=new Worker("zhang san", 5000, latch);
-
Worker worker2=new Worker("li si", 8000, latch);
-
worker1.start();//
-
worker2.start();//
-
latch.await();//等待所有工人完成工作
-
System.out.println("all work done at "+sdf.format(new Date()));
-
}
-
-
-
static class Worker extends Thread{
-
String workerName;
-
int workTime;
-
CountDownLatch latch;
-
public Worker(String workerName ,int workTime ,CountDownLatch latch){
-
this.workerName=workerName;
-
this.workTime=workTime;
-
this.latch=latch;
-
}
-
public void run(){
-
System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date()));
-
doWork();//工作了
-
System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date()));
-
latch.countDown();//工人完成工作,计数器减一
-
-
}
-
-
private void doWork(){
-
try {
-
Thread.sleep(workTime);
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
-
-
}
输出:
Worker zhang san do work begin at 2011-04-14 11:05:11
Worker li si do work begin at 2011-04-14 11:05:11
Worker zhang san do work complete at 2011-04-14 11:05:16
Worker li si do work complete at 2011-04-14 11:05:19
all work done at 2011-04-14 11:05:19