CountDownLatch示例

import java.util.concurrent.CountDownLatch;
/**
 * 这个适用于等待N个线程执行完任务,再执行另外的线程的任务。
 * @author Administrator
 *
 */
public class Driver {
	private  int N = 5;
	void test() throws InterruptedException {
	     CountDownLatch startSignal = new CountDownLatch(1);
	     CountDownLatch doneSignal = new CountDownLatch(N);//make sure the "N" equal the number of threads

	     for (int i = 0; i < N; ++i) // create and start threads
	       new Thread(new Worker(startSignal, doneSignal)).start();

	     long start = System.nanoTime();// don't let run yet
	     startSignal.countDown();      // let all threads proce
	     System.out.println(startSignal.getCount());
	     doneSignal.await();           // make the main thread wait for all to finish
	     long end = System.nanoTime();
	     System.out.println("time = " + (end -start)+"ns "+Thread.currentThread().getName());//所有等待的线程执行完了,才会执行这行语句。
	   }
	
	public static void main(String ...args){
		Driver dr = new Driver();
		try{
			dr.test();
		}catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

class Worker implements Runnable {
	   private final CountDownLatch startSignal;//startSignal被多个线程共用
	   private final CountDownLatch doneSignal;//doneSignal被多个线程共用
	   Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
	      this.startSignal = startSignal;
	      this.doneSignal = doneSignal;
	   }
	   public void run() {
	      try {
	        startSignal.await();//使当前线程在锁存器倒计数至零之前一直等待,除非线程被中断。
	        doWork();
	        doneSignal.countDown();//递减锁存器的计数,如果计数到达零,则释放所有等待的线程,执行一次计数器减去1,不会自动减到0
	} catch (InterruptedException ex) {} // return;
	   }

	   void doWork() {
		   System.out.println("working..."+Thread.currentThread().getName());
	   }
	 }

你可能感兴趣的:(java,thread)