关注:CodingTechWork
引言
在一次数据割接需求中,数据需要通过编程的方式进行转移割接到新平台,此时若串行化方式,无疑会拉锯此次战斗,所以首当其冲要使用并发编程来降低割接时长。
本次主要考虑使用CountDownLatch
工具类进行并发编程的控制。
CountDownLatch
概述
在并发编程过程中,如何让多个线程之间协调执行任务,如主线程等所有其他异步线程执行完毕后再继续执行下面的步骤,如何做到?我们可以考虑使用CountDownLatch
。
CountDownLatch
主要是起到线程之间的同步协调作用,而不是互斥。它可以让一个线程等待其他线程完成任务后,再继续执行自己的任务。
原理
-
CountDownLatch
是基于计数器的原理,内部有一个整型的计数器。 - 在类中使用
CountDownLatch
时,需要制定一个初始的计数值,该值指定的事需要等待的线程数目。 - 关于计数值,每当完成一个线程任务时,会调用
CountDownLatch
的countDown()
方法,计数器值就会递减1。当计数值递减到0时,就会唤醒等待的线程,继续执行等待线程的任务。
并发编程实践
基本用法
- 创建
CountDownLatch
对象,初始化指定计数值(等待线程数)。 - 创建多线程,线程执行完毕后,调用
countDown()
方法。 - 等待线程执行
await()
方法,等待计数值递减为0后继续执行本线程的程序。
代码模板
public Boolean testCountDownLatchAsync() {
ExecutorService taskExecutor = Executors.newFixedThreadPool(10);
//初始化
final CountDownLatch latch = new CountDownLatch(10);
for (Integer customerId : customerIdList) {
Runnable run = new Runnable() {
@Override
public void run() {
try {
//异步执行代码
} catch (Exception e) {
log.error("线程执行失败!错误信息:", e);
} finally {
latch.countDown(); //每次调用CountDown(),计数减1
}
}
};
taskExecutor.execute(run);
}
try {
//等待所有线程执行完毕
latch.await();//主程序执行到await()函数会阻塞等待线程的执行,直到计数为0
} catch (InterruptedException e) {
e.printStackTrace();
}
taskExecutor.shutdown();//关闭线程池
return true;
}
总结
CountDownLatch
是一个同步工具类,主要应用于多线程编程场景中,可以用于控制等待线程的执行,或者说是协调多个线程之间的同步。
用好这个工具类,主要关注这个工具类的初始计数值的设置、countDown()
方法、await()
方法即可实现编程。