在下面的代码片段中干净地处理单个任务的最佳方式

问题描述 投票:0回答:0
public List<String> doSomething(List<String> list) {

ExecutorService executorService = Executors.newCachedThreadPool();
int size = list.size(); 

List<CompletableFuture<String>> completableFutureList = list.stream().map(entry -> {
    if (size > 1) {
        return CompletableFuture.supplyAsync(() -> solve(entry), executorService);
    } else {
        return CompletableFuture.supplyAsync(() -> solve(entry), MoreExecutors.directExecutor());
    }
}).collect(Collectors.toList());

List<String> stringList = completableFutureList.stream().map(future -> {
    try {
        return future.get();
    } catch (InterruptedException | ExecutionException e) {
        log.info(...);
        return null;
    }
}).collect(Collectors.toList());

return stringList;

}

private String solve(String entry) {
   if (entry == "ABC")
     return ...
   throw new RuntimeException();
}




首先想知道以下一般查询的答案:

  1. 将单个任务运行到新线程而不是在同一个主线程中运行是否有任何缺点,考虑到直到新线程完成任务时主线程才被阻塞并且什么都不做?

  2. 如果我将“MoreExecutors.directExecutor()”作为执行者传递,那么任务是在主线程本身完成的,还是被委托给新线程?

现在,很少有与添加的代码片段相关的查询:

当我的大小等于 1 时,我不想通过新线程完成我的工作,而是通过主线程本身,为其他部分添加的代码是否做到了这一点 [通过使用“MoreExecutors.directExecutor()”]?此外,此代码是否有任何缺点或我在使用此代码时需要注意的事项?

我不想在这里使用“completedFuture()”方法,因为“solve()”方法可以抛出异常,我需要在 else 块本身中处理,但我想用“get()”处理所有异常" 方法 [在代码片段 try 块中] 以保持代码干净。

java multithreading concurrency executorservice completable-future
© www.soinside.com 2019 - 2024. All rights reserved.