通俗的讲就是,CountDownLatch相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个CountDownLatch的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说CountDownLatch的状态是一次性的
public class CountDownLatchDemo { final static SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); public static void main(String[] args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(2);// 两个工人的协作 Worker worker1 = new Worker("zhangsan", 5000, latch); Worker worker2 = new Worker("lisi", 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(workerName + " start at " + sdf.format(new Date())); doWork();// 工作了 System.out.println( workerName + " complete at " + sdf.format(new Date())); latch.countDown();// 工人完成工作,计数器减一 } private void doWork() { try { Thread.sleep(workTime); } catch (InterruptedException e) { e.printStackTrace(); } } } }