【发布时间】:2022-08-07 23:42:30
【问题描述】:
假设我们有 n 个独立的阻塞 IO 任务,例如休息呼叫另一台服务器的任务。然后我们需要结合所有答案。每个任务的处理时间可以超过 10 秒。
-
我们可以按顺序处理它,最后花费~n*10 秒:
Task1Ans task1 = service1.doSomething(); Task2Ans task2 = service2.doSomething() ... return result; -
另一种策略是使用 CompletableFuture 以并行方式处理它,并在所有任务上花费约 10 秒:
CompletableFuture<Task1Ans> task1Cs = CompletableFuture.supplyAsync(() -> service1.doSomething(), bestExecutor); CompletableFuture<Task2Ans> task2Cs = CompletableFuture.supplyAsync(() -> service2.doSomething(), bestExecutor); return CompletableFuture.allOf(task1Cs, task2Cs) .thenApply(nothing -> { ... // combine task1, task2 into result object return result; }).join();第二种方法有好处,但我不明白哪种类型的线程池最适合这种任务:
ExecutorService bestExecutor = Executors.newFixedThreadPool(30) /// or Executors.newCachedThreadPool() or Executors.newWorkStealingPool()我的问题是哪个 ExecutorService 最适合处理 n 并行阻塞 IO 任务。
标签: java executorservice completable-future