CountDownLath,可以理解为倒计时器,是一个线程同步的辅助类,用指定的数值来初始化 倒计时器初始值(new CountDownLath(100)),
调用对象的countDown的方法,将会使计时器减1,当减到0后,那么此对象会唤醒调用对象await方法所正在等待的线程,如果计数器已经为0,
后续线程调用await方法的时候,会立即返回,不会阻塞。
下面模拟一个跑步计数器:
import java.util.Random;
import java.util.concurrent.CountDownLatch;
/**
*
* @author YangBaoBao
*
*/
public class CountDownLathDemo {
/**
* @param args
*/
public static void main(String[] args) {
final CountDownLatch order=new CountDownLatch(1);
final CountDownLatch waitDown=new CountDownLatch(100);
final CountDownLatch countDown=new CountDownLatch(100);
for(int i=0;i<100;i++){
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(new Random().nextInt(1000));
System.out.println(Thread.currentThread().getName()+"--正在准备");
waitDown.countDown();
order.await();
System.out.println(Thread.currentThread().getName()+"--开跑");
Thread.sleep(new Random().nextInt(2000));
System.out.println(Thread.currentThread().getName()+"--到达终点");
countDown.countDown();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
try {
waitDown.await();
System.out.println("所有人都已到齐");
System.out.println("开枪");
order.countDown();
countDown.await();
System.out.println("所有人都已到达终点");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}