【问题标题】:CompletableFuture from ExecutorService来自 ExecutorService 的 CompletableFuture
【发布时间】:2017-12-11 10:23:14
【问题描述】:

我创建了一个自定义ExecutorService

ExecutorService executor =
        new ThreadPoolExecutor(0, maxPoolSize, keepAliveTime, timeUnit,
                               new LinkedBlockingDeque<>());

我向其提交任务

Future<String> result = executor.submit(() -> "test");

如你所见,执行器返回一个微薄的Future;我宁愿有一个 CompletableFuture 可以与其他 CompletableFutures 链接。

Guava 中,我们有返回ListenableFuturesListeningExecutorService。就我的意图和目的而言,那些ListenableFutures 和CompletableFutures 一样好。

不过,我还是想尽可能多地使用 Java 的标准库,这意味着我正在寻找一种方法来从我的自定义执行程序中获取 CompletableFutures。

【问题讨论】:

    标签: java executorservice completable-future


    【解决方案1】:

    事后看来很明显:不要试图从 executor 那里获得 CompletableFuture,而是将 executor 传递给 CompletableFuture

    像这样:

    CompletableFuture<String> futureOutput =
            CompletableFuture.supplyAsync(() -> "test", executor);
    

    任务将使用executor 提供的线程之一执行,并且客户端具有CompletableFuture 的所有便利来获取任务的结果。

    【讨论】:

    • 你也可以使用 Executors.newFixedThreadPool() 或 Executors.newCachedThreadPool() 代替 executor
    • CompletableFuture futureOutput = CompletableFuture.supplyAsync(() -> "test", Executors.newCachedThreadPool());
    猜你喜欢
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    相关资源
    最近更新 更多