Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java CompletableFuture如何知道任务是独立的?_Java_Concurrency_Java 8_Java.util.concurrent_Completable Future - Fatal编程技术网

Java CompletableFuture如何知道任务是独立的?

Java CompletableFuture如何知道任务是独立的?,java,concurrency,java-8,java.util.concurrent,completable-future,Java,Concurrency,Java 8,Java.util.concurrent,Completable Future,假设我们有以下虚拟代码: CompletableFuture<BigInteger> cf1 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(2L)); CompletableFuture<BigInteger> cf2 = CompletableFuture.supplyAsync(() -> BigInteger.valueOf(3L)); cf1.thenCombine(cf2, (x,

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

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);
CompletableFuture cf1=CompletableFuture.supplyAsync(()->biginger.valueOf(2L));
CompletableFuture cf2=CompletableFuture.SupplySync(()->BigInteger.valueOf(3L));
然后组合(cf2,(x,y)->x.add(y)).thenAccept(System.out::println);
JVM知道在这种情况下,
cf1
cf2
携带独立的线程吗?如果线程是依赖的(例如,使用一个到数据库的连接),会发生什么变化


更一般地说,CompletableFuture如何同步线程?

我不认为CompletableFuture(CF)“同步线程”。如果您未提供遗嘱执行人,则使用遗嘱执行人或


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

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

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

static
runAsync
方法只是助手方法。
supplyAsync
的javadoc状态

返回一个新的
CompletableFuture
,它由 在
ForkJoinPool.commonPool()
中运行的任务,其值已获取 通过调用给定的
供应商

这或多或少相当于

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();
ForkJoinPool.commonPool().submit(()->{
试一试{
R result=sup.get();
未来。完成(结果);
}捕获(可丢弃的e){
未来。完全例外(e);
}
});
回归未来;
返回
CompletableFuture
,甚至允许您在任务提交到池之前完成它

更一般地说,
CompletableFuture
如何同步线程

它不知道,因为它不知道哪些线程在它上面运行。这在报告中得到了进一步的暗示

因为(与
FutureTask
不同),该类无法直接控制 导致其完成的计算
,取消被视为 这只是另一种特殊的完成形式。方法cancel具有 与
completeeexception(new CancellationException())的效果相同。
。 方法
isCompletedExceptionally()
可用于确定
CompletableFuture
以任何特殊方式完成


CompletableFuture
对象不控制处理。

谢谢您的回答。我理解你所说的一切,我只想了解这一切的底层背景。