在这方面,未来与可完成的未来有什么区别?

时间:2019-07-18 07:53:34

标签: java java-8 future completable-future

用例示例

在以下示例方面,使用Future和Completable Future有什么区别。

我读到的主要用途之一是在将来可以使用.apply()来连接多种方法。

Future在将方法连接到method()内并在单独的线程中调用该方法(将其连接)时不是这种情况。

我发现他们两个都在做同一件事。有人可以解释吗?

class FutureExample {

    static boolean method1() {
        return true;
    }
    static boolean method2(boolean m) {
        return m;
    }

    static boolean method() {
        boolean v = method1();
        return method2(v);
    }

    public static void main(String[] args) {
        ExecutorService service = Executors.newFixedThreadPool(1); //initialize to 1 for stackoverflow question
        Future<Boolean> future = service.submit(FutureExample::method);
    }
}

VERSUS

class CompletableFutureExample {

    static boolean method1() {
        return true;
    }
    static boolean method2(boolean m) {
        return m;
    }

    public static void main(String[] args) {
        CompletableFuture<Boolean> future = CompletableFuture.supplyAsync(CompletableFutureExample::method1).thenApply(CompletableFutureExample::method2);
    }
}

2 个答案:

答案 0 :(得分:1)

  1. CompletableFuture用于编写非阻塞代码,方法是在与主线程不同的线程上运行任务,并向线程通知进度。结果可能有两种:
    • 已完成
    • 失败

这种情况下的主要区别在于,您可以使用.compleate(T t)方法来完成Future单元。

  1. 使用CompletableFuture,可以附加Callable方法:
    • thenAccept(Function f)
    • thenApply(...)
    • thenRun(...)

使用Future时,不会收到通知,而使用CompletableFuture则具有此可能性。

我希望我回答了你的问题。祝你有美好的一天。

答案 1 :(得分:0)

  1. 在第一种情况下(仅适用于Future):

    • 这两个方法始终在同一线程中执行,并且该线程被阻塞,直到两个功能都完成

    • 没有异步异常处理

    • 您无法轻松地组合/修改执行链:您始终需要为每种功能组合声明一个新方法

在此特定示例中,差异不明显。的真正力量 当您需要合并/合并不同异步调用的结果,处理整个链的异常,管理线程等时,会出现CompletableFuture(或更笼统的CompletionStage)。