对于批量操作,若是我们使用for循环串行操作,那么可能会导致接口超时。若我们使用并发执行,首先遇到的问题便是不知道最后一个线程什么时候回执行完毕。
1. countDownLatch的作用
CountDownLatch是java.util.concurrent包下的一个类,它允许一个或多个线程等待其他的线程执行到某一操作。
CountDownLatch是通过一个计数器来实现的,计数器的初始值就是线程的数量,每当一个线程完成自己的任务后,计数器的值就会减一。当计数器值到达0后,表示所有线程都已经完成自己的任务,然后等待的线程便可以恢复执行的任务。
2. countDownLatch的API
1. 构造函数
public CountDownLatch(int count) {
if (count < 0) throw new IllegalArgumentException("count < 0");
this.sync = new Sync(count);
}
count实际上就是闭锁等待的线程数量,这个值只能设置一次,不能重复设置这个计数值。
2. 阻塞方法:await
public void await() throws InterruptedException {
sync.acquireSharedInterruptibly(1);
}
与CountDownLatch的第一次交互是主线程等待其他线程,主线程必须在启动其他线程后立即调用await()方法来阻塞主线程,直到其他线程完成各自的任务。
3. 计数器减一:countDown()
public void countDown() {
sync.releaseShared(1);
}
其他N个线程通过countDown方法完成调用,没调用一次该方法,构造函数中的初始的count值就会-1,当count值为0时,主线程就能通过await()方法,恢复执行自己的任务。