问题标签 [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.
java - CompletableFuture 如何知道任务是独立的?
想象一下,我们有以下虚拟代码:
JVM 是否知道这一点cf1并cf2在这种情况下携带独立的线程?如果线程依赖(例如,使用一个到数据库的连接)会发生什么变化?
更一般的,如何CompletableFuture同步线程?
java - Java 8 CompletableFuture 与 Netty 未来
CompletableFutureJDK 8 中引入的与io.netty.util.concurrent.FutureNetty 提供的相比如何?
Netty 文档提到
JDK 8 添加了 CompletableFuture,它有些重叠
io.netty.util.concurrent.Futurehttp://netty.io/wiki/using-as-a-generic-library.html
我试图得到答案的问题是:
- 它们的相同点和不同点是什么?
- 两者的性能特征有何不同?哪一个能够更好地扩展?
关于相似之处/不同之处,我已经能够提出以下几点:
相似之处: 基本相似之处在于与 Java Future 相比,两者都是非阻塞的。这两个类都有可用于向未来添加侦听器、内省任务的失败和成功并从任务中获取结果的方法。
区别:
CompletableFuture似乎有一个更丰富的接口,用于组合多个异步活动等。io.netty.util.concurrent.Future另一方面,Netty 允许将多个侦听器添加到同一个 Future,此外还允许删除侦听器。
java - 您如何访问传递给 CompletableFuture allOf 的已完成期货?
我正在尝试掌握 Java 8 CompletableFuture。我怎样才能将这些加入到人并在“allOf”之后返回它们。下面的代码不起作用,但可以让您了解我尝试过的内容。
在javascript ES6中我会做
到目前为止我在 Java 方面的努力
java - 当另一组 CompletableFuture 完成时,如何完成 CompletableFuture?
我有一个可完成的未来(future1),它创建了 10 个可完成的期货(futureN)。有没有办法将 future1 设置为仅当所有 futureN 都完成时才完成?
java - 返回 CompletableFuture还是 CompletableFuture ?
我想编写一个返回CompletableFuture. 未来的唯一目的是跟踪方法何时完成,而不是其结果。是返回更好CompletableFuture<Void>还是CompletableFuture<?>?是否有理由偏爱其中一个,或者它们可以互换?
CompletableFuture本身CompletableFuture<Void>从它的许多方法中返回。java.nio有一个:Future<Void>。AsynchronousSocketChannelFuture<Void> connect(SocketAddress remote)- 另一方面,
java.util.concurrent类喜欢ExecutorService和ScheduledExecutorServicereturnFuture<?>:例如, withFuture<?> submit(Runnable task)。
请注意,我只询问返回类型,而不是参数列表、变量声明或其他上下文。
java - CompletableFuture,可变对象和内存可见性
我试图了解CompletableFutureJava 8 中如何与Java 内存模型交互。在我看来,对于程序员的理智来说,理想情况下,以下内容应该是正确的:
- 线程中完成
CompletableFuture发生之前的操作,任何与完成相关的阶段都被执行 - 线程中
注册完成的动作会在完成依赖阶段执行之前创建一个依赖阶段
java.util.concurrent 文档中有一条注释说:
线程中的操作在提交
Runnable到Executor发生之前执行之前。同样对于Callables 提交到一个ExecutorService.
这表明第一个属性为真,只要完成未来的线程执行完成依赖阶段或将其提交给Executor. 另一方面,在阅读CompletableFuture 文档后,我不太确定:
为非异步方法的依赖完成提供的操作可以由完成当前的线程执行,也可以由
CompletableFuture完成方法的任何其他调用者执行。
这让我想到了我的问题:
- 上面的两个假设属性是真的还是假的?
- 是否有任何特定文档说明在使用 时是否存在内存可见性保证
CompletableFuture?
附录:
以具体示例的方式,考虑以下代码:
是否保证添加"foo"到list1lambda 函数可见?是否保证添加list1到list2的依赖阶段是可见的future?
grails - 用于证明异步调用的 Grails 应用程序指标可以带来更好的响应时间
我目前有一个 grails 应用程序,在 grails 2.4.2 上运行,它似乎使用 java 期货以阻塞方式进行 REST 调用,如下所示
我的目标是将这段代码重构为异步的,因为上面的代码片段似乎通过立即调用“阻塞”get 函数来破坏使用异步编程的目的。我正在考虑以下选项
我的问题不是要考虑哪些选项,而是更多关于是否有一种简单、简单的方法来衡量指标,以表明使用非阻塞调用将为访问 grails web 应用程序的用户提供更好的响应时间。
java - 如何将 CompletableFuture.supplyAsync 与 PriorityBlockingQueue 一起使用?
我正在尝试通过 CompletableFuture.supplyAsync 将优先级队列添加到使用 ThreadPoolExecutor 和 LinkedBlockingQueue 的现有应用程序中。问题是我无法想出一个设计来分配任务优先级,然后我可以在 PriorityBlockingQueue 的比较器中访问这些优先级。那是因为我的任务被 CompletableFuture 封装到一个名为 AsyncSupply 的私有内部类的实例中,该实例将原始任务隐藏在私有字段中。然后使用这些转换为 Runnables 的 AsyncSupply 对象调用 Comparator,如下所示:
我研究了扩展 CompletableFuture 的可能性,以便我可以将它包装在不同的对象中,但 CompletableFuture 的大部分内容都是封装且不可继承的。因此,扩展它似乎不是一种选择。也不是用适配器封装它,因为它实现了一个非常广泛的接口。
除了复制整个 CompletableFuture 并对其进行修改之外,我不确定如何解决此问题。有任何想法吗?
java - 定义 API 时应该返回 CompletableFuture 还是 Future?
在 Java 8 中,接口或抽象类定义返回CompletableFuture而不是返回的API 更好Future吗?考虑到转换为丑陋Future的CompletableFuture事实,并且这CompletableFuture将使调用者更灵活地直接使用函数式样式,那么 API 只返回的充分理由是Future什么?
java - 并行流和 CompletableFuture 的区别
在“Java 8 in action”一书中(由 Urma、Fusco 和 Mycroft 撰写)他们强调并行流在内部使用公共 fork 连接池,虽然这可以全局配置,例如使用 System.setProperty(...),但不可能为单个并行流指定值。
我已经看到了涉及在定制的 ForkJoinPool 中运行并行流的解决方法。
在本书的后面,他们有一整章专门介绍 CompletableFuture,在此期间他们有一个案例研究,他们比较了使用 parallelStream 与 CompletableFuture 各自的性能。事实证明,它们的性能非常相似——它们强调这样做的原因是它们都默认使用相同的公共池(因此线程数量相同)。
他们继续展示了一个解决方案,并认为 CompletableFuture 在这种情况下更好,因为它可以配置为使用自定义 Executor,线程池大小由用户选择。当他们更新解决方案以利用它时,性能会显着提高。
这让我想到 - 如果使用上面突出显示的解决方法对并行流版本执行相同的操作,性能优势是否会相似,因此这两种方法会在性能方面再次变得相似吗?在这种情况下,当开发人员显然需要更多工作时,为什么要选择 CompletableFuture 而不是并行流。