【发布时间】:2021-06-04 07:42:50
【问题描述】:
我开始对 Java CompletableFuture 组合感到满意,我曾使用过 JavaScript Promise。基本上,组合只是在指定的执行程序上安排了链式命令。但我不确定执行组合时哪个线程正在运行。
假设我有两个执行者,executor1 和 executor2;为简单起见,假设它们是单独的线程池。我安排了CompletableFuture(使用非常宽松的描述):
CompletableFuture<Foo> futureFoo = CompletableFuture.supplyAsync(this::getFoo, executor1);
完成后,我使用第二个执行器将Foo 转换为Bar:
CompletableFuture<Bar> futureBar .thenApplyAsync(this::fooToBar, executor2);
我了解getFoo() 将从executor1 线程池中的线程调用。我知道fooToBar() 将被executor2 线程池中的线程调用。
但是实际合成使用的是什么线程,即在getFoo()完成和futureFoo()完成之后;但是之前 fooToBar() 命令被安排在executor2 上? 换句话说,哪个线程实际运行代码以在第二个执行程序上安排第二个命令?
调度是否作为executor1 中调用getFoo() 的同一线程的一部分执行?如果是这样,这个可完成的未来组合是否等同于我在executor1 任务的第一个命令中手动安排fooToBar()?
【问题讨论】:
-
这是执行调用的线程,这取决于您的代码库。但是不,它既不是来自
executor1也不是executor2。thenApplyAsync的全部意义在于仅在这些操作中具有确定性。可能是more details here -
"它是调用线程的线程......" 你到底是什么意思?你的意思是,如果在我的
main()方法中的一个名为main-thread的线程中我调用原始的CompletableFuture.supplyAsync(),那么当它完成时,在executor2中安排fooToBar()操作的调用将在main-thread中为好吧?但这怎么可能呢,因为main-thread已经异步地走上了愉快的道路,现在正在分解素数或其他什么? -
我可能有点误解了你的问题,抱歉。您的问题是哪个线程将在
executor2上安排执行作为thenApplyAsync的一部分? -
是的,@Eugene,这正是我的问题。 “换句话说,哪个线程实际运行代码以在第二个执行程序上调度第二个命令 [作为
thenApplyAsync()的一部分]?” -
我确信它只是完成了第一个未来的线程,我不明白为什么它应该/可能是任何其他的。随意阅读
CompletableFuture和CompletionStage的来源。我刚刚做了,它看起来就像是第一个未来.. 代码读起来很糟糕,我无法确定它,所以我不想写答案。
标签: java parallel-processing completable-future executor