首先讲一下这个类是干嘛的:
这是java中的同步辅助类。作用:在完成一组正在其他线程中执行的操作之前,它允许线程一直等待。这个类使用一个整数进行初始化,这个整数就是线程等待完成的操作数目。当一个线程要等待某些操作先执行完时,需要调用await()方法,这个方法让线程进入休眠直到等待的所有操作都完成。当某一个操作完成后,他将调用countDown()方法将CountDownLatch类的内部计数器减一。当计数器变成0的时候,CountDownLatch类将唤醒所有调用await方法而进入休眠的线程。
代码小例子:
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.CountDownLatch;
public class CountdownLatchDemo {
public static void main(String[] args) {
CountDownLatch latch = new CountDownLatch(2);
Worker w1 = new Worker("Fishing",2000,latch);
Worker w2 = new Worker("Astall",1000,latch);
w1.start();
w2.start();
try {
latch.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("All work done!!");
}
}
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() {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
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();
}
}
}