CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法
public CountDownLatch(int count);
public void countDown();
public void await() throws InterruptedException
构造方法参数指定了计数的次数
countDown方法,当前线程调用此方法,则计数减一
awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0
1 public class CountDownLatchDemo { 2 final static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 3 public static void main(String[] args) throws InterruptedException { 4 CountDownLatch latch=new CountDownLatch(2);//两个工人的协作 5 Worker worker1=new Worker("zhang san", 5000, latch); 6 Worker worker2=new Worker("li si", 8000, latch); 7 worker1.start();// 8 worker2.start();// 9 latch.await();//等待所有工人完成工作 10 System.out.println("all work done at "+sdf.format(new Date())); 11 } 12 13 14 static class Worker extends Thread{ 15 String workerName; 16 int workTime; 17 CountDownLatch latch; 18 public Worker(String workerName ,int workTime ,CountDownLatch latch){ 19 this.workerName=workerName; 20 this.workTime=workTime; 21 this.latch=latch; 22 } 23 public void run(){ 24 System.out.println("Worker "+workerName+" do work begin at "+sdf.format(new Date())); 25 doWork();//工作了 26 System.out.println("Worker "+workerName+" do work complete at "+sdf.format(new Date())); 27 latch.countDown();//工人完成工作,计数器减一 28 29 } 30 31 private void doWork(){ 32 try { 33 Thread.sleep(workTime); 34 } catch (InterruptedException e) { 35 e.printStackTrace(); 36 } 37 } 38 } 39 40 41 }