JAVA多线程CountDownLatch使用详解
什么是CountDownLatch
CountDownLatch是一种同步工具类,它可以让一个或多个线程等待其他线程完成操作后再执行。其主要方法是:
public class CountDownLatch {
public CountDownLatch(int count);
public void await() throws InterruptedException;
public void countDown();
}
其中,构造函数里的参数count指定了计数器的初始值,等待线程可以调用await()方法来等待计数器变为0,而其他线程调用countDown()方法来减少计数器的值。当计数器变为0时,所有等待的线程均被唤醒。
CountDownLatch使用示例
下面分别给出两种使用CountDownLatch的示例。
示例一:多线程文件下载
在多线程文件下载的过程中,需要等待所有线程都将文件下载完成后,才能将这些文件合并成一个完整的文件。
public class MultiThreadDownloader {
public static void main(String[] args) {
// 文件下载链接列表
List<String> urls = Arrays.asList(
"https://example.com/file1",
"https://example.com/file2",
"https://example.com/file3"
);
// 创建一个CountDownLatch实例
CountDownLatch latch = new CountDownLatch(urls.size());
// 启动多个线程去下载文件
for (String url: urls) {
new Thread(() -> {
// 下载文件
download(url);
// 减少计数器的值
latch.countDown();
}).start();
}
// 等待所有线程下载完成
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 合并文件
mergeFiles();
}
}
在上面的示例中,首先创建一个CountDownLatch实例,然后创建多个线程去下载文件,每个线程下载完成后,都会调用countDown()方法来减少计数器的值,最后等待所有线程下载完成后,再合并这些文件。
示例二:线程池任务等待
在使用线程池执行任务的时候,有时候需要等待所有任务都执行完毕后再执行某些操作。这个时候,也可以使用CountDownLatch来实现。
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建一个线程池
ExecutorService executorService = Executors.newFixedThreadPool(10);
// 创建一个CountDownLatch实例
CountDownLatch latch = new CountDownLatch(10);
// 提交多个任务到线程池中
for (int i = 0; i < 10; i++) {
executorService.submit(() -> {
// 执行任务
doTask();
// 减少计数器的值
latch.countDown();
});
}
// 等待所有任务执行完毕
try {
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 关闭线程池
executorService.shutdown();
}
private static void doTask() {
// 模拟任务执行
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上面的示例中,首先创建一个线程池,然后创建一个CountDownLatch实例,并提交多个任务到线程池中。每个任务执行完毕后,都会调用countDown()方法来减少计数器的值,最后等待所有任务执行完毕后,再关闭线程池。
总结
CountDownLatch是一个非常有用的同步工具类,可以让多个线程之间协调、同步。它的使用方法比较简单,只需要先创建一个实例,然后等待线程调用countDown()方法来减少计数器的值,并在需要等待的地方调用await()方法等待计数器变为0即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JAVA多线程CountDownLatch使用详解 - Python技术站