1.java
package com.test.frame.test.countDownLatch; import java.text.SimpleDateFormat; import java.util.Date; import java.util.concurrent.CountDownLatch; /** * created by guanguan on 2017/10/26 **/ public class CountDownLatchDemo { final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); static class Worker extends Thread { private String workName; private int workTime; CountDownLatch latch; public Worker(String workName, int workTime, CountDownLatch latch) { this.workName = workName; this.workTime = workTime; this.latch = latch; } public Worker(Worker worker) { } @Override public void run() { System.out.println("worker : "+workName +"start begin at "+sdf.format(new Date())); doWork(); System.out.println("worker : "+workName +"start complete at "+sdf.format(new Date())); } private void doWork() { try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); }finally { latch.countDown();//工人完成工做,计数器减一 } } } public static void main(String[] args) throws InterruptedException { /** * 初始化CountDownLatch,将其值置为2,latch计数器的操做是原子性的 */ CountDownLatch latch=new CountDownLatch(2); Worker worker1= new Worker("WORK-1",5000,latch); Worker worker2= new Worker("WORK-2",2000,latch); Worker worker3= new Worker("WORK-3",1000,latch); worker1.start(); latch.await(); //此时将永远阻塞,由于只有一个线程开启,完成任务 worker2.start(); worker3.start(); } } 运行结果是: worker : WORK-1start begin at 2017-10-26 14:32:54 worker : WORK-1start complete at 2017-10-26 14:32:59 此时因为latch.await()的缘由,则线程将永远阻塞,由于latch仍是1,没有置为0,则线程2,线程3将没法进行 若是将 latch.await(); //此时将永远阻塞,由于只有一个线程开启,完成任务 worker2.start(); 这两行对换, public static void main(String[] args) throws InterruptedException { CountDownLatch latch=new CountDownLatch(2);//两个工人的协做 Worker worker1= new Worker("WORK-1",5000,latch); Worker worker2= new Worker("WORK-2",2000,latch); Worker worker3= new Worker("WORK-3",1000,latch); worker1.start(); worker2.start(); latch.await(); worker3.start(); } 运行结果以下: worker : WORK-2start begin at 2017-10-26 14:34:35 worker : WORK-1start begin at 2017-10-26 14:34:35 worker : WORK-2start complete at 2017-10-26 14:34:37 worker : WORK-1start complete at 2017-10-26 14:34:40 worker : WORK-3start begin at 2017-10-26 14:34:40 worker : WORK-3start complete at 2017-10-26 14:34:41 Process finished with exit code 0 代表线程1,线程2同时运行,并阻塞,而后1,2所有完成以后,线程3才开始运行