Java中的CountDownLatch是一个同步工具类,它的主要作用是让一个或多个线程阻塞等待其它线程完成某些操作后再继续执行,可以很好地实现多线程任务的协调。
CountDownLatch的实现方式是通过一个计数器来实现的,初始化时需要传入一个计数器的值,每当一个线程完成相关操作后,计数器的值就会减1,直到计数器的值为0时,所有因调用await()方法而等待的线程都可以继续执行。
具体实现可以有以下步骤:
-
创建一个CountDownLatch对象,它的计数器初始值为1,也可以根据具体情况设置更大的值;
-
在需要等待的地方调用CountDownLatch的await()方法,然后等待计数器的值变为0,这里会阻塞当前线程的执行;
-
当需要等待的任务完成时,调用CountDownLatch的countDown()方法将计数器的值减1;
-
当计数器的值为0时,被await()方法阻塞的线程会被唤醒继续执行。
以下是两个示例说明:
示例1:
假设我们有一个任务需要开启多个线程来进行处理,当所有线程都处理完之后才能继续执行下一步操作。
public class CountDownLatchDemo {
private static final int THREAD_NUM = 5;
private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(THREAD_NUM);
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(THREAD_NUM);
for (int i = 0; i < THREAD_NUM; i++) {
executorService.execute(new Runnable() {
@Override
public void run() {
// 线程执行具体任务
COUNT_DOWN_LATCH.countDown();
}
});
}
try {
COUNT_DOWN_LATCH.await();
// 所有线程执行完毕
System.out.println("All threads have finished...");
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
}
}
这个示例中,我们创建了一个固定线程数为5的线程池,然后循环创建5个任务并提交给线程池执行,在每个任务中调用countDown()方法将计数器减1。最后在主线程中调用await()方法等待计数器的值变为0,即所有线程都执行完毕,然后输出提示信息。
示例2:
假设我们需要同时下载多个文件,当所有文件都下载完成之后再进行下一步操作。
public class CountDownLatchDemo {
private static final String[] URLS = {"url1", "url2", "url3", "url4"};
private static final CountDownLatch COUNT_DOWN_LATCH = new CountDownLatch(URLS.length);
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(URLS.length);
for (String url : URLS) {
executorService.execute(new DownloadTask(url));
}
try {
COUNT_DOWN_LATCH.await();
// 所有文件下载完毕
System.out.println("All files have been downloaded...");
} catch (InterruptedException e) {
e.printStackTrace();
}
executorService.shutdown();
}
private static class DownloadTask implements Runnable {
private String url;
public DownloadTask(String url) {
this.url = url;
}
@Override
public void run() {
// 下载文件
System.out.println("Download " + url + " successfully...");
COUNT_DOWN_LATCH.countDown();
}
}
}
这个示例中,我们创建了一个固定线程数与待下载文件数相等的线程池,然后循环创建相应的文件下载任务并提交给线程池执行,在每个任务中调用countDown()方法将计数器减1。最后在主线程中调用await()方法等待计数器的值变为0,即所有文件都下载完成,然后输出提示信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java countDownLatch如何实现多线程任务阻塞等待 - Python技术站