java异步任务相关的工具。主要用在某些线程须要等到其余线程完成某些操做后才能执行的场景。java
等待线程须要显示的调用wait方法,表示线程当前挂起,须要等到countdownLatch到0才执行。另外一些线程调用countDown对countDownLatch - 1,达到0时则调用wait方法的线程获得执行。dom
小明去吃铁板烧快餐,来到窗口后他发现都是旧菜可是他但愿吃刚煮好的。通过交谈后师傅承诺以前的菜卖完就给他煮新的,这个时候小明就占据了这个窗口,其余窗口则继续卖菜。终于旧菜卖完了小明也拿到了新的菜,愉快的吃起了饭。
这里窗口就是线程数,小明所在窗口须要其余窗口把旧菜卖完才能有新的菜,小明所在的线程是挂起的,其余窗口每卖一份就对这个菜减一。菜的量就是CountDownLatch。异步
package calvin; import java.util.Random; import java.util.concurrent.CountDownLatch; public class TestCountDownLatch { public static void main(String[] args){ CountDownLatch latch = new CountDownLatch(2); Window win = null; for(int i =0; i< 4; i ++){ win = new Window(latch); new Thread(win).start(); } System.out.println("wait"); try { latch.await(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("down"); } public static class Window implements Runnable{ private CountDownLatch latch = null; public Window(CountDownLatch latch){ this.latch = latch; } @Override public void run(){ int time = new Random().nextInt(5) * 1000; try { Thread.sleep(time); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("thread = " + Thread.currentThread().getName()); latch.countDown(); } } } // 运行结果: wait thread = Thread-1 thread = Thread-0 down thread = Thread-3 thread = Thread-2
CountDonwLatch能够用做一个计数器。主要用在某个线程须要等待某个事件发生后才能被执行的地方。ide