CountDownLatch类的概念和应用场景
- 概念
CountDownLatch
是Java中的一个同步工具类,它允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。- 它通过一个计数器来实现,计数器的初始值为正数。当计数器的值减为0时,表示所有需要等待的操作都已完成。
- 应用场景
- 并行计算:将一个大任务分解成多个子任务,每个子任务由一个线程执行。主线程使用
CountDownLatch
等待所有子任务完成后再继续执行后续操作。 - 资源初始化:在应用程序启动时,需要初始化多个资源(如数据库连接、缓存等)。可以使用
CountDownLatch
确保所有资源都初始化完成后,应用程序才正式对外提供服务。 - 多线程测试:在多线程测试中,可以使用
CountDownLatch
来同步多个测试线程的执行,确保所有测试线程都执行完毕后再进行结果汇总和分析。
- 并行计算:将一个大任务分解成多个子任务,每个子任务由一个线程执行。主线程使用
如何使用CountDownLatch实现多个线程之间的协调工作
- 创建
CountDownLatch
对象- 在主线程中创建一个
CountDownLatch
对象,并指定计数器的初始值。例如,如果有3个子任务需要执行,则创建一个初始值为3的CountDownLatch
对象:
- 在主线程中创建一个
import java.util.concurrent.CountDownLatch;
public class CountDownLatchExample {
public static void main(String[] args) {
int numberOfTasks = 3;
CountDownLatch latch = new CountDownLatch(numberOfTasks);
// ...
}
}
- 子线程执行任务并减少计数器
- 在每个子线程中执行任务,当任务完成后,调用
CountDownLatch
对象的countDown()
方法来减少计数器的值。
- 在每个子线程中执行任务,当任务完成后,调用
public class SubTask implements Runnable {
private CountDownLatch latch;
public SubTask(CountDownLatch latch) {
this.latch = latch;
}
@Override
public void run() {
try {
// 执行子任务逻辑
System.out.println("Sub - task is running");
Thread.sleep(1000);
System.out.println("Sub - task is completed");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
latch.countDown();
}
}
}
- 主线程等待所有子任务完成
- 在主线程中调用
CountDownLatch
对象的await()
方法,使主线程进入等待状态,直到计数器的值减为0。
- 在主线程中调用
public class CountDownLatchExample {
public static void main(String[] args) {
int numberOfTasks = 3;
CountDownLatch latch = new CountDownLatch(numberOfTasks);
for (int i = 0; i < numberOfTasks; i++) {
Thread thread = new Thread(new SubTask(latch));
thread.start();
}
try {
latch.await();
System.out.println("All sub - tasks are completed");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
总结
CountDownLatch
是一种非常有用的同步工具类,适用于多个线程之间的协调工作。通过创建CountDownLatch
对象、在子线程中执行任务并减少计数器、在主线程中等待计数器减为0,可以轻松实现多个线程之间的同步操作。