java - JDK8中的CompletableFutures什么时候会阻塞执行线程?

标签 java multithreading java-8 completable-future

示例1:

CometableFuture
    .supplyAsync(new MySupplier())
    .someCompletableFutureMethod(new SomeCompletableFutureComsumer())

ForkJoin 线程是否会被阻塞?

示例2:

final CompletableFuture cf = new CompletableFuture();
cf = executor.execute(new Runnable(){
    public void run(){
        //do work
        cf.complete(result);
    }
});
cf.whenComplete(new MyConsumer());

涉及的任何踏板是否被堵塞?

(我知道,我应该使用 Callable 而不是 Runnable :)

有什么方法可以滥用 API,而不使用从 Future 继承的方法来阻止任何线程(main、ForkJoin、executor)?

假设我没有使用任何阻塞 API(我知道 future.get() block )。

最佳答案

CompletableFuture 添加了 join() 方法,这是 Future.get(某种的非检查异常版本)(docs here)。 但我不建议使用它,因为如果不设置超时,它可能会挂起线程,并且您几乎总是可以使用 thenApply 和 friend 重写代码。 我尝试通过始终使用 CompletionStage(CompletableFuture 实现)来强制执行此操作。

除了从 Future block 继承的方法之外,我认为没有其他方法。

关于java - JDK8中的CompletableFutures什么时候会阻塞执行线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44798590/

相关文章:

java - 在 android 中处理最近的应用程序点击和主页按下

java - 有很多空对象会耗尽内存吗?如果是这样,是否有使用 ArrayDeque 作为队列的替代方法?

java - 如何使 Ctrl-C、Ctrl-X 在 Eclipse 中与 IntelliJ 一样工作

Java 字节码缺少局部变量表

java - 从 Nullable 对象创建 Stream 的惯用方法

parallel-processing - 是否有一种从Java 8流中提取数据 block 的好方法?

C++ 多线程执行速度变慢

Android:简单 UDP 程序的问题

c++ - 使用 C++ 的递归线程使资源暂时不可用

java - getCanonicalHostName 返回不合格的名称