有时候我们有这样的一个需求,并发多个任务,需要等待一个信号,然后他们都开始执行,所有任务执行完成后通知主线程。如果是类似这样的需求你就可以考虑CountDownLatch这个类了。话不多说,直接上代码:
import java.util.concurrent.CountDownLatch;
/**
* 开关锁存器
* @author li
*
*/
public class LatchTest {
private static final int N=5;
public static void main(String[] args) throws InterruptedException {
CountDownLatch startSignal=new CountDownLatch(1);
CountDownLatch allTaskEndSignal=new CountDownLatch(N);
for(int i=0;i<N;i++){
new Thread(new TaskLatch(startSignal,allTaskEndSignal)).start();
}
System.out.println("main:"+System.nanoTime());
Thread.sleep(1000);
startSignal.countDown();
System.out.println("main:"+System.nanoTime());
allTaskEndSignal.await();
System.out.println("main:"+System.nanoTime());
}
static class TaskLatch implements Runnable{
/*
* 用于等待启动信号
*/
private final CountDownLatch startSignal;
/*
* 发送结束信号
*/
private final CountDownLatch taskEndSignal;
public TaskLatch(CountDownLatch startSignal,CountDownLatch taskEndSignal){
this.startSignal=startSignal;
this.taskEndSignal=taskEndSignal;
}
@Override
public void run() {
try {
startSignal.await();//阻塞
doSomething();
} catch (InterruptedException e) {
//IG
}
taskEndSignal.countDown();
}
private void doSomething() throws InterruptedException{
System.out.println(Thread.currentThread().getName()+":"+System.nanoTime());
Thread.sleep(1000);
}
}
}
执行main方法的结果为:
main:92926451620442
main:92927451389987
Thread-4:92927451744534
Thread-3:92927451637703
Thread-2:92927451625574
Thread-0:92927451480023
Thread-1:92927451480489
main:92928453290545