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将各种任务提交到该池,该池依次管理底层线程以执行任务。它不知道,也不尝试同步任何内容。正确同步对可变共享数据的访问仍然是客户端的责任。ACompletableFuture
与任何线程都没有关系。它只是异步检索的结果的持有者,使用方法对该结果进行操作
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
对象不控制处理。谢谢您的回答。我理解你所说的一切,我只想了解这一切的底层背景。