【问题标题】:How does CompletableFuture know that tasks are independent?CompletableFuture 如何知道任务是独立的?
【发布时间】:2015-12-04 15:10:55
【问题描述】:

假设我们有以下虚拟代码:

CompletableFuture<BigInteger> cf1 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(2L));
CompletableFuture<BigInteger> cf2 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(3L));
cf1.thenCombine(cf2, (x, y) -> x.add(y)).thenAccept(System.out::println);

JVM 是否知道cf1cf2 在这种情况下带有独立的线程?如果线程依赖(例如,使用一个到数据库的连接)会发生什么变化?

更一般的,CompletableFuture 是如何同步线程的?

【问题讨论】:

    标签: java concurrency java-8 java.util.concurrent completable-future


    【解决方案1】:

    CompletableFuture 与任何线程都没有关系。它只是异步检索结果的持有者,并使用对该结果进行操作的方法。

    static supplyAsyncrunAsync 方法只是辅助方法。 supplyAsync 的 javadoc 状态

    返回一个由 a 异步完成的新 CompletableFuture 任务在ForkJoinPool.commonPool() 中运行,获得的值 通过调用给定的Supplier

    这或多或少等同于

    Supplier<R> sup = ...;
    CompletableFuture<R> future = new CompletableFuture<R>();
    ForkJoinPool.commonPool().submit(() -> {
         try {
            R result = sup.get();
            future.complete(result);
        } catch (Throwable e) {
            future.completeExceptionally(e);
        }
    });
    return future;
    

    返回CompletableFuture,甚至允许您在任务提交到池之前完成它。

    更一般的,CompletableFuture 是如何同步线程的?

    它不知道,因为它不知道哪些线程正在对其进行操作。 javadoc

    中进一步暗示了这一点

    因为(不像FutureTask)这个类不能直接控制 导致其完成的计算,取消被视为 只是另一种形式的异常完成。方法取消具有 与completeExceptionally(new CancellationException()) 的效果相同。 方法isCompletedExceptionally() 可用于确定是否存在 CompletableFuture 以任何非凡的方式完成。

    CompletableFuture 对象不控制处理。

    【讨论】:

      【解决方案2】:

      我认为 CompletableFuture (CF) 不会“同步线程”。它使用执行器you have providedcommon pool(如果您没有提供)。

      当您调用supplyAsync 时,CF 会将各种任务提交到该池,该池依次管理底层线程以执行任务。

      【讨论】:

      • 感谢您的回答。你说的我都懂,我只想了解这一切的底层背景。
      【解决方案3】:

      它不知道,也不会尝试同步任何东西。正确同步对可变共享数据的访问仍然是客户端的责任。

      【讨论】:

        猜你喜欢
        • 2018-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-20
        • 1970-01-01
        • 2011-01-22
        • 2010-10-20
        • 2013-10-04
        相关资源
        最近更新 更多