线程异步编排并行(CompletableFuture)

本文详细介绍了如何使用Java的CompletableFuture进行线程异步编排,包括两个任务组合(runAfterBoth、thenAcceptBoth、thenCombine)和任意任务完成后的处理(runAfterEither、acceptEither、applyToEither),以及多任务组合(allOf、anyOf)的示例应用,展示了如何在多线程环境下高效地组织并发任务。

美图

在这里插入图片描述

两个任务组合(一)

任务一和任务二都处理完成之后,才能处理任务三

runAfterBoth

组合两个future,不需要获取future的结果,只需要两个future处理完成后,处理该任务,无返回结果

CompletableFuture<Void> runAfterBoth(CompletionStage<?> other, Runnable action)
CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other, Runnable action)
CompletableFuture<Void> runAfterBothAsync(CompletionStage<?> other, Runnable action, Executor executor)
示例
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> System.out.println("任务1"));
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> System.out.println("任务2"));
future1.runAfterBoth(future2, () -> System.out.println("任务3"));

thenAcceptBoth

组合两个future,需要获取future的结果,只需要两个future处理完成后,处理该任务,无返回结果

CompletableFuture<Void> thenAcceptBoth(CompletionStage<? extends U> other, BiConsumer<? super T, ? super U> action)
CompletableFuture<Void> thenAcceptBothAsync(CompletionStage<? extends U> other, BiConsumer<? super T, ? super U> action)
CompletableFuture<Void> thenAcceptBothAsync(CompletionStage<? extends U> other, BiConsumer<? super T, ? super U> action, Executor executor)
示例
CompletableFuture<Integer> future1 = CompletableFuture.supplyAsync(() -> {
   
   
    System.out.println("任务1");
    return 10;
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
   
   
    System.out.println("任务2");
    return 20;
});
future1.thenAcceptBoth(future2, (res1, res2) -> {
   
   
    System.out.println("任务3"
Java中,多线程异步编排通常涉及到使用并发库,如`java.util.concurrent`包提供的工具。其中一些关键组件包括: 1. **Future和Callable**: `Callable`接口用于异步计算任务,它返回一个`Future`对象,可以获取计算结果或检查是否完成。你可以通过提交`Callable`到`ExecutorService`来启动任务,并通过`Future.get()`阻塞等待结果。 2. **ExecutorService**: 这是一个服务,负责管理和调度提交给它的Runnable或Callable任务。常见的实现有`ThreadPoolExecutor`, `ScheduledExecutorService`等。 3. **Thread池** (`ThreadPoolExecutor`): 提供一组预先创建的线程,可以高效地处理大量并发任务,避免频繁创建销毁线程的开销。 4. **CompletableFuture**: 是Java 8引入的一个高级API,它提供了更简洁的方式来处理异步操作的结果。可以链式调用 `.thenApply()`, `.thenAccept()`, `.thenRun()` 等方法来组织复杂的异步流程。 5. **异步回调**: 当你需要在某个操作完成后立即执行其他操作时,可以使用`Runnable`和`Consumer`接口,它们提供了一种简单的回调机制。 6. **FutureTask**: 可以将一个Callable封装成一个Future,这使得Callable的任务能够像Runnable一样在ExecutorService中运行。 异步编程有助于提高系统的响应性和吞吐量,因为任务可以在后台线程并行执行,而主线程则继续处理用户交互。然而,需要小心管理资源和同步问题,以防数据竞争和死锁。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值