Java并发编程:等待所有异步任务执行完成

在Java中,我们经常会遇到需要执行异步任务的场景,比如同时发送多个网络请求,或者同时进行多个计算任务。在这种情况下,我们往往需要等待所有异步任务执行完成后再进行下一步操作。本文将介绍如何在Java中等待所有异步任务执行完成的方法,并给出代码示例。

使用CountDownLatch

CountDownLatch是Java.util.concurrent包中提供的一个同步工具类,可以用来控制线程的执行顺序。我们可以利用CountDownLatch来等待所有异步任务执行完成。下面是一个简单的示例代码:

import java.util.concurrent.CountDownLatch;

public class Main {
    public static void main(String[] args) throws InterruptedException {
        CountDownLatch latch = new CountDownLatch(3);

        for (int i = 0; i < 3; i++) {
            new Thread(() -> {
                // 模拟异步任务的执行
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 执行完成");
                latch.countDown();
            }).start();
        }

        latch.await();
        System.out.println("所有异步任务执行完成");
    }
}

在上面的示例代码中,我们创建了一个CountDownLatch对象,并在主线程中调用await方法来等待所有异步任务执行完成。在每个异步任务执行完成后,我们调用countDown方法来减少CountDownLatch的计数器。当计数器为0时,await方法返回,主线程继续执行。

使用CompletableFuture

Java 8引入了CompletableFuture类,可以简化异步编程的操作。我们可以利用CompletableFuture来等待所有异步任务执行完成。下面是一个示例代码:

import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<CompletableFuture<Void>> futures = Stream.of(1, 2, 3)
            .map(i -> CompletableFuture.runAsync(() -> {
                // 模拟异步任务的执行
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + " 执行完成");
            }))
            .collect(Collectors.toList());

        CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
        allOf.join();

        System.out.println("所有异步任务执行完成");
    }
}

在上面的示例代码中,我们使用Stream API创建了多个CompletableFuture对象,每个CompletableFuture对象代表一个异步任务。然后我们调用CompletableFuture.allOf方法来等待所有异步任务执行完成。最后调用join方法等待所有异步任务执行完成。

总结

本文介绍了在Java中等待所有异步任务执行完成的两种方法:使用CountDownLatch和CompletableFuture。使用这两种方法可以很方便地实现等待异步任务执行完成的功能,从而提高程序的并发性能和响应速度。在实际开发中,根据具体场景选择合适的方法来等待所有异步任务执行完成。

希望本文对你有所帮助,谢谢阅读!