问题标签 [completable-future]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
141 浏览

java - 使用 CompletableFuture 故意吹堆栈不会产生堆栈溢出?

我试图查看故意导致 CompletableFuture 堆栈溢出的行为,但发现它导致了成功,并且我的递归循环刚刚停止并退出,并且 junit 测试通过了。这真的不是我想要的行为。我想要一个快速失败的行为,所以我知道要修复我的代码。

我试图在 Eclipse 中调试计数 1455,但 Eclipse 冻结并且无法加载堆栈跟踪,所以我找不到这种行为背后的原因。

所以我的问题很简单

  1. 我的代码是否不正确?
  2. CompletableFuture 如何成功退出(或者在这种情况下我的 junit 测试用例如何通过)。

也许操作系统很重要……我在 Mac 上。我以前有自己的本土承诺,而那些成功地打破了堆栈。

0 投票
1 回答
69 浏览

java - 在保持线性可读性的同时委托给线程

我一直在尝试不同的方法来处理结果断开连接的阻塞方法,同时保持可能已被中断的状态。我发现必须处理发送和接收难以对齐的不同类和方法是令人沮丧的。

在下面的示例中,SomeBlockingMethod()通常返回void作为消息发送到其他进程。但相反,我synchronized用一个接收结果的侦听器来实现它。通过将其旋转到一个线程,我可以wait()超时或无限期地获得结果。

这很好,因为一旦返回结果,我就可以继续处理在等待线程任务结果时必须暂停的特定状态。

我的方法有什么问题吗?

尽管这个问题可能看起来很笼统,但我特意寻找有关Java线程的建议。

示例伪代码:

使用 CompletableFuture 更新:

或者更好:

严格使用的问题CompletableFuture在于它CompletableFuture.thenAccept是从全局线程池中运行的,并且不能保证与调用线程同步。

为同步任务添加调度程序可以解决这个问题:

CompletableFuture与完整的调度程序方法相比,使用的一个警告是,存在于外部的任何先前状态都必须是最终的或有效的最终状态。

0 投票
1 回答
4192 浏览

java - 为什么 CompletableFuture 的 thenAccept() 不在主线程上运行

我在 CompletableFuture 的 supplyAsync() 中处理长时间运行的操作,并将结果输入 thenAccept()。有时 thenAccept() 在主线程上执行,但有时它在工作线程上运行。但我只想在主线程上运行 thenAccept() 操作。这是示例代码。

结果是:

我怎样才能解决这个问题 ?

0 投票
2 回答
5804 浏览

java - 如何在不阻塞的情况下启动 CompletableFuture 并在完成后执行某些操作?

CompletableFutureAPI 相当吓人,有很多接受,然后和其他东西;很难说为什么存在不同的选择。

我基本上是在尝试模仿一个new Thread(() -> dostuff).start()但具有更好的线程池、错误处理等。注意:我实际上并不需要Runnable这里的接口,我正在生成一段现有的代码。

启动异步任务并在完成后执行行为的正确方法是什么?或处理抛出的异常?

0 投票
1 回答
14004 浏览

java - CompletableFuture 的分离异常处理

我意识到我希望我们 API 的使用者不必处理异常。或者更清楚地说,我想确保始终记录异常,但只有消费者知道如何处理成功。如果客户愿意,我希望客户也能够处理异常File,我无法返回给他们。

注:FileDownload是一个Supplier<File>

我真的不明白这些CompletionStage东西。我使用exceptionorhandle吗?我返回原来的未来还是他们返回的未来?

0 投票
1 回答
73 浏览

java - 如何在完成时异步重新加入原始线程?

尽管我不认为这是 Vaadin 特定的问题。我真正需要做的就是重新加入未来在完成时创建的线程。

我需要这些线程 ID 相同,显然我可以重做这个。我知道有一个加入,但现在确定当我在完成之前不想重新加入时这对我有什么帮助?

0 投票
1 回答
8563 浏览

java - 如何将一种类型的 CompletableFuture 转换为另一种类型?

我目前将我的转换CompletableFuture<X>CompletableFuture<Void>如下所示,但我想知道是否有更好的方法。

0 投票
2 回答
47 浏览

java - 一个可以传递给ExecutorService的对象,并且在Runnables之间有依赖关系

我正在尝试创建一个具有依赖关系的对象。关键是,具有 ExecutorService 的类和生成 Runnables 的类是不同的。这是简单的抽象:

当这些类是一个时,我曾经使用 CompletableFuture:

但现在pool居住在另一个班级。我看到 CompletableFuture 类的文档更多,但我仍然不确定它是否有帮助。

有没有人在这里有一些知识?

0 投票
2 回答
17811 浏览

java - CompletableFuture 链接结果

我正在尝试将方法的调用/结果链接到下一个调用。我得到编译时错误 methodE 因为如果我无法从之前的调用中获取 objB 的引用。

如何将上一个调用的结果传递给下一个链?我完全误解了这个过程吗?

0 投票
2 回答
716 浏览

asynchronous - 如何转换 CompletableFuture> 到流无阻塞

我正在使用Async Http Client 库(使用 Netty)向 RESTful API 发出异步 Http Get 请求。由于我想保留非阻塞行为,因此我将返回实例CompletableFuture<T>作为 Http Get 请求的结果。所以,当一个 RESTful API 端点返回一个 Json 数组时,我返回一个CompletableFuture<T[]>.

然而,根据 Erik Meijer 对编程中的四个基本效果所做的分类,我认为这Stream<T>更适合发出异步 Http Get 请求并返回 Json 数组的 Java 方法的结果。在这种情况下,我们可以将Stream<T>视为Observable<T>等价物,它是返回许多值的异步计算的结果

因此,考虑到resp保持响应,那么我可以得到CompletableFuture<Stream<T>>如下结果:

但是,我想知道如何在不等待计算完成的情况下将其转换CompletableFuture<Stream<T>> resp为 a Stream<T>(即我不想阻止get()调用)?

我希望得到与以下表达式相同的结果,但不阻塞get()