在Java.util.concurrent包下,有一个CountDownLatch类。
官方定义:A synchronization aid that allows one or more threads to wait untila set of operations being performed in other threads completes.
其能够根据给定的初始值,调用await()方法使线程处于阻塞的状态,直到调用countDown()方法的次数与初始值相同,再继续向下执行。
/**
* 闭锁
* 多个线程执行完毕之后再进行相应的操作
* CountDownLatch 没一个线程执行完毕之后调用相应的countDown会减1
*/
public class TestCountDownLatch {
public static void main(String[] args) {
//初始值为5,与创建的线程数相同
CountDownLatch latch=new CountDownLatch(5);
LatchDemo ld=new LatchDemo(latch);
long startTime=System.currentTimeMillis();
//创建五个线程
for(int x=0;x<5;x++){
new Thread(ld).start();
}
try {
/**
* 处于阻塞状态,直到所有的线程(5个)都执行结束才继续向下执行
*/
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
long endTime=System.currentTimeMillis();
System.out.println("耗时"+(endTime-startTime));
}
}
class LatchDemo implements Runnable {
private CountDownLatch latch;
public LatchDemo(CountDownLatch latch){
this.latch=latch;
}
public void run() {
try{
synchronized (this) {
for(int x=0;x<50000;x++){
System.out.println(x);
}
}
}
finally{
/**
* 没调用一下,初始值的数值减一
*/
latch.countDown();
}
}
}
在很多需要等到所有线程执行完后继续下一步的场景下可以用到此类。