当前位置: 首页 > 知识库问答 >
问题:

ForkJoinPool在CompletableFuture.SupplyAsync()中的行为

闻人河
2023-03-14

我比较了CompletableFuture.SupplyAsync()在以下两种情况下的行为:我设置了一个自定义ExecutorService,或者我希望我的供应商由默认的executor(如果没有指定)执行,这两种情况是forkJoinPool.commonpool()

public class MainApplication {
  public static void main(final String[] args) throws ExecutionException, InterruptedException {

    Supplier<String> action1 = () -> {
        try {
            Thread.sleep(3000);
        }finally {
            return "Done";
        }
    };
    Function<String, String> action2 = (input) -> {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            return input + "!!";
        }
    };

    final ExecutorService executorService = Executors.newFixedThreadPool(4);

    CompletableFuture.supplyAsync(action1, executorService)
                     .thenApply  (action2)
                     .thenAccept (res -> System.out.println(res));

    System.out.println("This is the end of the execution");

  }
}

完成了!!

所以“done”会在主执行结束后打印出来。

但如果我用:

CompletableFuture.supplyAsync(action1)

共有1个答案

鞠自明
2023-03-14

在这两种情况下

CompletableFuture.supplyAsync(action1, executorService)
                     .thenApply  (action2)
                     .thenAccept (res -> System.out.println(res));

你不会等待任务完成。但是接下来你的程序要退出了,而常见的fork加入池有何不同:

ForkJoinPool.commonPool()

和定期执行人服务:

final ExecutorService executorService = Executors.newFixedThreadPool(4);

shutdown()方法将允许以前提交的任务在终止之前执行

我想这可能是你问的不同之处。

 类似资料:
  • 代码: 我有上面的代码来并行执行一些任务。考虑到已经让调用线程等待完成,不知道它是否应该是而不是块中的。 注意:仅从输入列表中读取。

  • 我正在比较算法(前n个数之和)的顺序和并行性能(使用ForkJoinPool): 我试着用不同的NumLoop来获得不同的值,但顺序法总是表现得更好,而且也是按3-4的顺序。 考虑到阵列大小并不是那么小,并行版本在这里的性能不应该更好吗。

  • 问题内容: 跟进如何在线程池中使用MDC?如何将MDC与?具体来说,我如何在执行任务之前包装一个MDC值? 问题答案: 以下内容似乎对我有用: 和 针对您的任务而不是普通的ForkJoinPool 运行任务。 代替扩展。

  • 问题内容: 我正在使用jsr166y ForkJoinPool在线程之间分配计算任务。但是我显然一定做错了。 如果创建并行度> 1(默认值为Runtime.availableProcessors();我一直在运行2-8个线程)的ForkJoinPool,我的任务就可以正常工作。但是,如果我创建并行度= 1的ForkJoinPool,则在无法预测的迭代次数后会看到死锁。 是的-设置并行度= 1是一种

  • 我使用jaxb进行解组,但当我使用ForkJoinPool execute()方法时,我会得到一个“java.log.ClassNotFoundException:com.sun.xml.internal.bind.v2.ContextFactory”,但我确信在我的运行时类路径中存在,因为当我不使用ForkJoinPool时,它会正常工作。。。你知道这方面的问题或解决方法吗? 我使用Java 1

  • 问题内容: 要并行或异步运行某些内容,我可以使用ExecutorService:或CompletableFuture Api :( 假设在两种情况下我都使用相同的Executor) 除了返回类型vs. 之外,还存在其他显着差异。或什么时候使用什么? 如果我将API与默认值一起使用(没有执行程序的方法)有什么区别? 问题答案: 除了返回类型Future与CompletableFuture之外,还存在