public class CountDownLatchDemo {
private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
CountDownLatch countDownLatch = new CountDownLatch(2);//2个线程工作
Worker worker1 = new Worker("lisi", 5000, countDownLatch);
Worker worker2 = new Worker("zhangsan", 10000, countDownLatch);
worker1.start();
worker2.start();
try {
countDownLatch.await();//等待两个线程完成工作
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
System.out.println("2个线程完成工作 at " + simpleDateFormat.format(new Date()));
}
static class Worker extends Thread {
private String name;
private int workTime;
private CountDownLatch countDownLatch;
public Worker(String name, int workTime, CountDownLatch countDownLatch) {
this.name = name;
this.workTime = workTime;
this.countDownLatch = countDownLatch;
}
public void run() {
System.out.println(name + " start work at " + simpleDateFormat.format(new Date()));
dowork();
System.out.println(name + " end work at " + simpleDateFormat.format(new Date()));
countDownLatch.countDown(); //一个线程完成任务减少1
}
private void dowork() {
try {
Thread.sleep(this.workTime);
} catch (InterruptedException e) {
e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
}
}
}
}
CountDownLatch底层也是使用了valatile变量,volatile int state