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());
}
}
CountDownLatch示例
最新推荐文章于 2024-07-14 22:18:32 发布