java.lang.Object ∟-java.util.concurrent.CountDownLatch
CountDownLatchhtml
直译过来就是倒计数(CountDown)门闩(Latch)。倒计数不用说,门闩的意思顾名思义就是阻止前进。在这里就是指 CountDownLatch.await() 方法在倒计数为0以前会阻塞当前线程。java
做用api
CountDownLatch 的做用和 Thread.join() 方法相似,可用于一组线程和另一组线程的协做。例如,主线程在作一项工做以前须要一系列的准备工做,只有这些准备工做都完成,主线程才能继续它的工做。这些准备工做彼此独立,因此能够并发执行以提升速度。在这个场景下就能够使用 CountDownLatch 协调线程之间的调度了。在直接建立线程的年代(Java 5.0 以前),咱们能够使用 Thread.join()。在 JUC 出现后,由于线程池中的线程不能直接被引用,因此就必须使用 CountDownLatch 了。并发
package zy.test; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; public class CountDownLatchTest { public static void main(String[] args) { /** * 需求:woker3 必须在 woker1和woker2执行完以后再执行 */ CountDownLatch countDownLatch=new CountDownLatch(2); Thread woker1 = new Thread(new Worker("woker1", 5, countDownLatch)); Thread woker2 = new Thread(new Worker("woker2", 5, countDownLatch)); Thread woker3 = new Thread(new Worker("woker3", 3, countDownLatch)); woker1.start(); woker2.start(); try { countDownLatch.await(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("worker1和worker2执行完成"); woker3.start(); } } class Worker implements Runnable{ private String workName; private long time; private CountDownLatch countDownLatch; public Worker(String workName, long time,CountDownLatch countDownLatch) { super(); this.workName = workName; this.time = time; this.countDownLatch=countDownLatch; } @Override public void run() { System.out.println(workName+" 开始工做。。。"); try { TimeUnit.SECONDS.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(workName+" 工做了 "+time+"秒后结束"); countDownLatch.countDown(); } }
运行结果:ide