java.util.concurrent.CountDownLatch 是一个并发构造,它允许一个或多个线程等待一系列指定操作的完成。
CountDownLatch 以一个给定的数量初始化。countDown() 每被调用一次,这一数量就减一。通过调用 await() 方法之一,线程可以阻塞等待这一数量到达零。
利用它可以实现类似计数器的功能。
比如有一个任务A,它要等待其他5个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。
举个例子:
有五个工人在为老板干活,这个老板有一个习惯,就是当五个工人把一天的活都干完了的时候,他就来检查所有工人所干的活。记住这个条件:五个工人先全部干完活,老板才检查。所以在这里用Java代码设计两个类,Worker代表工人,Boss代表老板
import java.util.concurrent.CountDownLatch; public class Main { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(5);//五个工人 //工人 Worker worker1 = new Worker(countDownLatch); new Thread(worker1).start(); Worker worker2 = new Worker(countDownLatch); new Thread(worker2).start(); Worker worker3 = new Worker(countDownLatch); new Thread(worker3).start(); Worker worker4= new Worker(countDownLatch); new Thread(worker4).start(); Worker worker5 = new Worker(countDownLatch); new Thread(worker5).start(); //老板 Boss boss = new Boss(countDownLatch); new Thread(boss).start(); } }
import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; /** * 工人 */ public class Worker implements Runnable{ private CountDownLatch countDownLatch; public Worker(CountDownLatch countDownLatch){ this.countDownLatch = countDownLatch; } @Override public void run() { System.out.println(Thread.currentThread().getName()+",工人在干活。。。"); try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+",工人干活结束。。。"); countDownLatch.countDown(); } }
import java.util.concurrent.CountDownLatch; /** * 老板 */ public class Boss implements Runnable{ private CountDownLatch countDownLatch; public Boss(CountDownLatch countDownLatch){ this.countDownLatch = countDownLatch; } @Override public void run() { System.out.println("老板等待所有工人干活完成。。"); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("所有工人干活完成,开始检查。。"); } }
结果:
Thread-0,工人在干活。。。 Thread-1,工人在干活。。。 Thread-3,工人在干活。。。 Thread-2,工人在干活。。。 Thread-4,工人在干活。。。 老板等待所有工人干活完成。。 Thread-2,工人干活结束。。。 Thread-3,工人干活结束。。。 Thread-1,工人干活结束。。。 Thread-4,工人干活结束。。。 Thread-0,工人干活结束。。。 所有工人干活完成,开始检查。。
适用场景:
CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
源码地址:https://github.com/qjm201000/concurrent_countDownLatch.git