简介
java异步任务相关的工具。主要用在某些线程需要等到其他线程完成某些操作后才能执行的场景。
等待线程需要显示的调用wait方法,表示线程当前挂起,需要等到countdownLatch到0才执行。另一些线程调用countDown对countDownLatch - 1,达到0时则调用wait方法的线程得到执行。
小故事
小明去吃铁板烧快餐,来到窗口后他发现都是旧菜但是他希望吃刚煮好的。经过交谈后师傅承诺之前的菜卖完就给他煮新的,这个时候小明就占据了这个窗口,其他窗口则继续卖菜。终于旧菜卖完了小明也拿到了新的菜,愉快的吃起了饭。
这里窗口就是线程数,小明所在窗口需要其他窗口把旧菜卖完才能有新的菜,小明所在的线程是挂起的,其他窗口每卖一份就对这个菜减一。菜的量就是CountDownLatch。
DEMO
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可以用作一个计数器。主要用在某个线程需要等待某个事件发生后才能被执行的地方。