闭锁状态包含一个计数器。初始化为一个正式,正数表示须要等待的事件数量。
countDown方法递减计数器。表示一个事件已经发生,而await方法等待计数器到达0。表示等待的事件已经发生。
CountDownLatch强调的是一个线程(或多个)须要等待另外的n个线程干完某件事情之后才干继续运行。10个运动相当于10个线程,这里关键是控制10个线程同一时候跑起来,还有怎么推断最后一个线程到达终点。能够用2个闭锁,第一个闭锁用来控制10个线程等待裁判的命令,第二个闭锁控制比赛结束。
package concurrent.thread;import java.util.concurrent.CountDownLatch;class Racer implements Runnable{private CountDownLatch start;private CountDownLatch finish;private int number;public Racer(int number, CountDownLatch start, CountDownLatch finish){this.start = start;this.finish = finish;this.number = number;}@Overridepublic void run() {try {System.out.println(number + "th racer ready!");//等待起跑的命令//注意这里不是用wait()start.await();System.out.println(number + "th racer finish!");//跑完finish.countDown();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public class CountDownLatchExample {public static void main(String[] args) throws InterruptedException{final int num = 10;CountDownLatch start = new CountDownLatch(1);//这里最好用CyclicBarrierCountDownLatch finish = new CountDownLatch(num);for(int i = 1; i <= num; i++){new Thread(new Racer(i, start, finish)).start();;}//等待一秒。防止线程没准备好就開始运行//假设用CyclicBarrier。这里就不用等待了Thread.sleep(1000);System.out.println("比赛開始");//比赛開始start.countDown();//等待比赛结束finish.await();System.out.println("比赛结束");}}
原文:http://www.cnblogs.com/lcchuguo/p/5157592.html