即当前线程,等待CountDownLatch中的各子线程任务都完成后,在继续往下执行的任务
下述demo新建一个倒数计数器10。
每个线程计数器调用countDownLatch.countDown();倒计数一次。
主方法里,使用线程池分发了十个线程做子任务,并调用countDownLatch.await();方法等待倒计数完成。
等十个子线程都完成后,倒计数为0,则主线程await()方法后的代码才执行。
import java.util.Random;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
* @Author:minglu
* @Description:
* @Date: 2018/11/27
*/
public class CountDownLatchDemo implements Runnable {
static final CountDownLatch countDownLatch = new CountDownLatch(10);
static final CountDownLatchDemo demo = new CountDownLatchDemo();
@Override
public void run() {
try{
//模拟检查任务
Thread.sleep(new Random().nextInt(10)*1000);
countDownLatch.countDown();
System.out.println("sub Check complete! rest sub check number:"+countDownLatch.getCount());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i = 0; i < 10; i++) {
service.submit(demo);
}
//等待十个检查任务完成
countDownLatch.await();
//
System.out.println("all check complete ! fire !");
service.shutdown();
}
}
运行结果
sub Check complete! rest sub check number:9
sub Check complete! rest sub check number:8
sub Check complete! rest sub check number:7
sub Check complete! rest sub check number:6
sub Check complete! rest sub check number:5
sub Check complete! rest sub check number:4
sub Check complete! rest sub check number:3
sub Check complete! rest sub check number:2
sub Check complete! rest sub check number:1
sub Check complete! rest sub check number:0
all check complete ! fire !