CountDownLatch的使用
遇到此问题的环境:我需要从数据库中取出5000条数据,循环数据,对每条数据每个字段进行分析处理,这里每个字段都会创建新的线程去处理,并写库;只有当每个线程执行完,才能进行下一次的循环。
CountDownLatch
- countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。
- 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待的线程就可以恢复工作了。
private ExecutorService pool = null;
private static int zdNum = 16;// 字段数
public void run() {
// 创建线程池
pool = Executors.newFixedThreadPool(zdNum);
// 定义计数器
final CountDownLatch latch = new CountDownLatch(zdNum);
// 获取5000条数据
List list = getData();
for(int i=1;i<=list.size();i++){
final int j = i; // 多线程中for循环变量需要拿出来定义
pool.execute(new Runnable() {
@Override
public void run() {
try{
switch(j) {
case 1:
case 2:
...
//分需求处理
}
}catch (Exception e) {
e.printStackTrace();
} finally {
latch.countDown();// 每个线程执行完,计数器-1 如果>0则会执行await方法阻塞线程。
}
}
});
}
latch.await();//阻塞当前线程,直到计数器的值为0 ,所以会等这次循环走完才会执行下一次循环。
}