- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在某个存储库类上有一个方法,它返回一个 CompletableFuture
。完成这些 futures 的代码使用了一个阻塞的第三方库。我打算有一个单独的有界 Executor
,这个存储库类将使用它来进行这些阻塞调用。
这是一个例子:
public class PersonRepository {
private Executor executor = ...
public CompletableFuture<Void> create(Person person) {...}
public CompletableFuture<Boolean> delete(Person person) {...}
}
我的应用程序的其余部分将组成这些 future 并对结果做一些其他事情。当提供给 thenAccept
、thenCompose
、whenComplete
等的这些其他函数时,我不希望它们在 上运行存储库的执行者
。
另一个例子:
public CompletableFuture<?> replacePerson(Person person) {
final PersonRepository repo = getPersonRepository();
return repo.delete(person)
.thenAccept(existed -> {
if (existed) System.out.println("Person deleted"));
else System.out.println("Person did not exist"));
})
.thenCompose(unused -> {
System.out.println("Creating person");
return repo.create(person);
})
.whenComplete((unused, ex) -> {
if (ex != null) System.out.println("Creating person");
repo.close();
});
}
JavaDoc 声明:
Actions supplied for dependent completions of non-async methods may be performed by the thread that completes the current CompletableFuture, or by any other caller of a completion method.
附带问题:为什么这里有一个或?在什么情况下存在未完成当前 future 的完成方法的另一个调用者?
主要问题:如果我希望所有的 println
都由不同于存储库使用的 Executor
执行,哪些方法我需要异步并手动提供执行程序吗?
很明显,thenAccept
需要更改为 thenAcceptAsync
,但我不确定这一点。
替代问题:哪个线程完成从 thenCompose
返回的 future?
我的猜测是,它将是完成从函数参数返回的 future 的任何线程。换句话说,我还需要将 whenComplete
更改为 whenCompleteAsync
。
也许我把事情复杂化了,但这感觉可能会变得非常棘手。我需要非常注意所有这些 future 的来源。同样从设计的角度来看,如果我返回一个 future ,我如何防止调用者使用我的执行者?感觉就像它打破了封装。我知道 Scala 中的所有转换函数都采用隐式 ExecutionContext
,这似乎可以解决所有这些问题。
最佳答案
附带问题:如果您将中间 CompletionStage
分配给一个变量并在其上调用一个方法,它将在同一线程上执行。
主要问题:只有第一个,所以将 thenAccept
更改为 thenAcceptAsync
-- 以下所有问题都将在用于接受的线程上执行它们的步骤。
备选问题:从 thenCompose
完成 future 的线程与用于撰写的线程相同。
您应该将 CompletionStages 视为在同一线程上快速连续执行的步骤(通过按顺序应用函数),除非您特别希望使用异步在不同的线程上执行该步骤。然后所有后续步骤都在该新线程上完成。
在您当前的设置中,这些步骤将像这样执行:
Thread-1: delete, accept, compose, complete
有了第一个 accept async,它就变成了:
Thread-1: delete
Thread-2: accept, compose, complete
关于你的最后一个问题,关于你的调用者使用的同一个线程,如果他们添加了额外的步骤——我认为除了不返回 CompletableFuture
之外你无能为力,而是一个普通的 Future
。
关于java - 编写 Java CompletableFutures 时使用哪个执行器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42705950/
我的应用程序中有 3 种不同的方法。全部返回CompletableFuture .我想并行执行方法 1 和 2。完成方法 1 和 2 后,我想使用方法 1 和 2 返回值的参数触发方法 3。 代码示例
我正在尝试加快对多个 API 的调用。 在下面的代码中,getFilteredEvents是当前同步版本。我有这样的感觉 map(x -> x.getFilteredEvents(eventResea
Q1。我的理解是,如果 future 正常或异常完成,就会调用 completableFuture.handle 。但是超时情况又如何呢? 第二季度。在哪里检查 completableFuture 的
我不明白这里发生了什么 CompletableFuture/supplyAsync。 如果我从先前实例化的 CompletableFuture 对象调用 supplyAsync 方法,它永远不会完成:
我有一个返回 CompletableFuture 的异步方法。 private CompletableFuture asyncA(..) 我公开了一个必须返回 CompleteableFuture 的
我在项目中找到了这段代码: int threadCount = 10; CompletableFuture[] futures = new CompletableFuture[threadCount]
让我们举个例子:我们有四种方法: CompletableFututre loadAndApply(SomeObject someObject); CompletableFuture loadData(
我有一个可完成的 future (future1),它创建了 10 个可完成的 future (futureN)。只有当所有 futureN 都完成时,有没有办法将 future1 设置为完成? 最佳
我想编写一个返回 CompletableFuture 的异步方法. future 的唯一目的是跟踪方法何时完成,而不是其结果。返回CompletableFuture会更好吗?或 Completable
我正在对我的数据库进行多次异步调用。我将所有这些异步调用存储在 List> list 上.我想一起收集所有结果,所以我需要等待所有这些调用完成。 一种方法是创建一个 CompletableFuture
我正在尝试使用 CompletableFuture 链接一些文件处理程序,它应该返回 CompletableFuture : CompletableFuture allGen = loadFile1(
我有 2 个 CompletableFuture。 task2 只能在 task1 完成后启动。然后,我需要等待所有任务完成。在下面的代码中,程序在 task1 结束后结束。 task2 开始但未完成
我有 2 个 CompletableFuture。 task2 只能在 task1 完成后启动。然后,我需要等待所有任务完成。在下面的代码中,程序在 task1 结束后结束。 task2 开始但未完成
我很难弄清楚这一点,并且可以向那些比我更有经验和知识的人寻求帮助。 基本问题是我需要获取对象列表,然后对于返回的每个对象,获取一些详细信息,并将详细信息缝合到对象中。我希望在这方面保持高效;我需要首先
我目前正在使用 CompletableFuture supplyAsync() 方法将一些任务提交到公共(public)线程池。这是代码片段的样子: final List>> completableF
为什么是CompletableFuture.allOf声明为 CompletableFuture而不是返回结果集合或其他东西?我认为制作 CompletableFuture.anyOf 是个好主意返回
我没有看到处理具有异步结果的异常的明显方法。 例如,如果我想重试一个异步操作,我会期待这样的事情: CompletionStage cf = askPong("cause error").handle
比如我有这样的方法: public CompletableFuture getPage(int i) { ... } public CompletableFuture getDocument(
我正在调用一个返回 CompletableFuture 的服务。 输出结构如下。 Class Output { public String name; public Integer a
我正在尝试转换 List>至CompletableFuture> .当您有许多异步任务并且需要获取所有这些任务的结果时,这非常有用。 如果其中任何一个失败,那么最终的 future 将失败。这就是我的
我是一名优秀的程序员,十分优秀!