详解Java多线程编程中CountDownLatch阻塞线程的方法
什么是CountDownLatch?
CountDownLatch
是一个 Java 工具类,用于管理和解决多线程编程中线程等待的问题,它可以让一个或多个线程等待其他线程执行完毕后再继续执行。
CountDownLatch的原理
CountDownLatch
中心思想是等待一个或者多个线程完成操作,这些操作通常是运算或者计算,当我们需要等到这些计算完成后再执行主线程,就可以使用 CountDownLatch
来阻塞线程。
CountDownLatch
内部维护一个计数器,一开始就要指定计数器的大小,每当一个线程完成操作后,计数器就会减一,当计数器为 0 时,等待的线程才能开始执行。
示例说明
示例一
下面是一个使用 CountDownLatch 的简单示例:我们希望在主线程中阻塞等待所有子线程完成统计工作后才能继续执行。
public class CountDownLatchExample {
public static void main(final String[] args) throws InterruptedException {
int threads = 5;
final CountDownLatch latch = new CountDownLatch(threads);
for (int i = 0; i < threads; i++) {
new Thread(new Runnable() {
@Override
public void run() {
//子线程中执行具体的统计工作
//...
//计数器减一
latch.countDown();
}
}).start();
}
//等待计数器减为0
latch.await();
//主线程中执行其他操作
//...
}
}
在这个例子中,主线程等待子线程完成具体统计工作后才能继续执行,子线程中执行真实的统计工作,当统计工作完成后,调用 countDown()
方法让计数器减一。主线程调用 await()
方法等待计数器减为0后再继续执行。
示例二
下面是一个更加实际的例子,展示了如何使用 CountDownLatch
等待多个并发线程完成任务。
public class ParallelTaskExample {
public static void main(String[] args) throws Exception {
int numberOfTasks = 5;
final CountDownLatch latch = new CountDownLatch(numberOfTasks);
ExecutorService executor = Executors.newFixedThreadPool(numberOfTasks);
for (int i = 0; i < numberOfTasks; i++) {
final int taskId = i;
executor.submit(new Runnable() {
@Override
public void run() {
//模拟子线程执行任务
try {
Thread.sleep((long) (Math.random() * 1000));
System.out.println("Task #" + taskId + " completed");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
//计数器减一
latch.countDown();
}
}
});
}
//等待所有任务完成
latch.await();
System.out.println("All tasks completed");
executor.shutdown();
}
}
在这个例子中,我们创建了一个包含5个任务的线程池,并使用 CountDownLatch
让主线程等待所有任务全部完成后再继续执行。每个任务都是一个简单的模拟,随机执行 1~1000 毫秒的工作,完成后调用 countDown()
方法让计数器减一,当计数器减为0时,主线程调用 await()
方法结束等待,并输出 "All tasks completed"。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Java多线程编程中CountDownLatch阻塞线程的方法 - Python技术站