java - 是否可以在创建它的同一线程中运行一个可完成的未来?
问题描述
想知道是否可以在创建它的线程中运行 completablefuture。你可能会问为什么我需要这样做,因为 completablefuture 是用于异步编程的。原因是我有很少的异步任务和一些我想在生成线程中运行的任务,以便我可以使用 allOf 等并保持代码的一致性
解决方案
当你说你想知道“一个可完成的未来是否可以在创建它的线程中运行”时,你表现出一种错误的心态。ACompletableFuture
不运行。ACompletableFuture
只是封装了一个值或异常,最多可以设置一次,我们称之为完成。
API 提供了许多方法来安排完成尝试,可能是异步的,但您不应该因为决定如何完成它而分心。
异步完成有一些简单的替代方案:
CompletableFuture<String> f = CompletableFuture.completedFuture("hello");
创造一个立即完成的未来。Java 9 增加failedFuture
了对创建一个立即异常完成的未来的支持。
您还可以轻松地创建一个将来在同一线程中完成的未来:
CompletableFuture<String> f = new CompletableFuture<>();
// arbitrary actions
f.complete("hello");
您还可以将工厂方法与执行程序一起使用,立即在启动线程中运行操作:
CompletableFuture<String> f
= CompletableFuture.supplyAsync(() -> "hello", Runnable::run);
或者
CompletableFuture<String> f
= CompletableFuture.supplyAsync(() -> {
if(Math.random() > 0.5) throw new IllegalStateException();
return "hello";
}, Runnable::run);
展示与调用complete
或创建立即完成的未来的区别。
当然,这些可能性可以与其他功能结合使用,例如allOf
:
CompletableFuture<String> a = new CompletableFuture<>();
CompletableFuture<String> b = new CompletableFuture<>();
CompletableFuture<String> c = new CompletableFuture<>();
CompletableFuture.allOf(a, b, c).whenComplete((__, t) -> {
if(t != null) System.err.println("failed with "+t);
else System.out.println("all completed "+a.join()+", "+b.join()+", "+c.join());
});
System.out.println("step 1");
a.complete("foo");
System.out.println("step 2");
b.complete("bar");
System.out.println("step 3");
c.complete("baz");
推荐阅读
- ios - 使用firebase聊天时如何从下到上设置数据
- outlook - Outlook 插件文档:位置和电子邮件用户的格式
- swift - 如何在swiftUI中忽略具有线性渐变的背景的安全区域?
- primefaces - 惰性搜索在 Primefaces 7.0 中不起作用
- hybris - Hybris 目录 cronjob 同步不起作用
- java - 实现时如何修复文本更改侦听器错误?
- python-3.x - 在 Jupyter Notebook 中隐藏代码单元,使用 Papermill 执行,使用 nbconvert 转换为 PDF
- pyserial - 使用 pyserial 从 COM 端口读取数据,但输出为空
- jena - 尝试将侦听器添加到模型(由 TDB2 数据集支持)
- php - 谷歌云柔性环境部署简单上传代码时如何修复RPCFailedError