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