【问题标题】:invokeall() wiht Future Versus CompletableFuture带有 Future Vs CompletableFuture 的 invokeall()
【发布时间】:2015-11-03 21:36:51
【问题描述】:

根据Oracle documentation

invokeAll() : 执行给定的任务,当所有任务完成时返回一个包含状态和结果的 Futures 列表。 Future.isDone() 对于返回列表的每个元素都为真。请注意,已完成的任务可能已经正常终止,也可能通过引发异常终止。如果在此操作进行时修改了给定的集合,则此方法的结果是不确定的。

CompletableFuture 还使用以下策略实现 Future:

  • 由于(与FutureTask 不同)此类无法直接控制导致其完成的计算,因此取消被视为另一种形式的异常完成。方法取消与completeExceptionally(new CancellationException()) 的效果相同。方法isCompletedExceptionally() 可用于确定CompletableFuture 是否以任何异常方式完成。

  • 如果使用CompletionException 异常完成,方法get()get(long, TimeUnit) 会抛出一个ExecutionException,原因与对应的CompletionException 中的原因相同。为了在大多数情况下简化使用,该类还定义了方法 join()getNow(T),在这些情况下直接抛出 CompletionException

有什么区别

  • invokeAll()Future

  • CompletableFuture

既然JDK 1.7不支持CompletableFuture,那么invokeAll()Future能达到同样的效果吗?

【问题讨论】:

  • 感谢您的反馈。更正了问题。
  • CompletableFuture 只是提供了对结果进行异步操作的可能性。 Future 没有。
  • 我现在已经检查了这个问题。该问题将 1.7 代码转换为 1.8 兼容代码。我正在寻找使用 1.7 代码实现 1.8 功能,因为我无法将 JDK 升级到 1.8
  • 抱歉,误读了。简单回答是不。您需要类似于 CompletableFuture 的内容来添加该行为。 Guava 提供ListenableFuture。转换与上一篇文章中的相同。见here

标签: java multithreading concurrency


【解决方案1】:

当然可以,只要你写一点代码:

  1. 复制/实施(所需/相关部分来自)CompletableFuture。例如,请查看this implementation on grepcode
  2. 扩展一个ExecutorService(您已经使用),并扩展protected方法newTaskFor()负责从RunnableCallable实例化Futures,在其中创建一个new CompletableFuture() .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-07
    • 2019-07-18
    • 2016-12-09
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多