java CountDownLatch

import java.util.Date;
import java.util.concurrent.CountDownLatch;

public class ThreadCountDownLatchDemo implements Runnable{
	CountDownLatch startLatch;
	CountDownLatch endLatch;
	int i;
	public ThreadCountDownLatchDemo(CountDownLatch startLatch,int i,CountDownLatch endLatch){
		this.startLatch=startLatch;
		this.endLatch=endLatch;
		this.i=i;
	}
	
	
	@Override
	public void run() {
		// TODO Auto-generated method stub
		try {
			startLatch.await();//等待主线程countDown,不然线程一直等待
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(i+"---------------------------------------"+new Date());
		endLatch.countDown();
	}
	
	
	public static void main(String[] args) {
		int i=10;
		final CountDownLatch startLatch=new CountDownLatch(1);
		final CountDownLatch endLatch=new CountDownLatch(i);
		for (int j=1 ; j <= i; j++) { 
			// 这里类似首先做了10个线程在那里,startLatch传入到线程中,然后再线程中startLatch.await,等待,等待主线程给启动命令这里startLatch设置成了1
			Thread t = new Thread(new ThreadCountDownLatchDemo(startLatch, j, endLatch));
			t.start();
		}
		startLatch.countDown();//这里处理了startLatch的1 变成了0 变成0就代表可以通过,也就是那10个线程开始工作的通知
		try {
			//await()才是CountDownLatch里相应的等待函数。
			//wait()是同步锁,是Object类的方法,与notify()配对使用的,使用时必须要有sychronized关键字。
			//endLatch.wait();
			endLatch.await();//然后主线程在这里等待其他子线程运行结束,都结束了就返回0 这样他才可以继续往下面运行
			System.out.println(new Date());
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

 

你可能感兴趣的:(CountDownLatch)