✅并发调三个方法,实现只要有一个成功就立即成功,否则等都失败才失败
典型回答
有的时候,我们需要实现这样的功能,比如说我们有多个黑名单需要校验,为了提升效率,需要并发执行,执行过程中,如果有结果先返回了,就判断他是否命中了黑名单,如果命中,则不用再等后续的其他请求了,直接拒绝即可,否则就要等所有的请求都返回,所有的返回都是通过,返回通过。
想要实现这个功能,可以借助CompletionService。
CompletionService是Java8的新增接口,JDK为其提供了一个实现类ExecutorCompletionService。这个类是为线程池中Task的执行结果服务的,即为Executor中Task返回Future而服务的。
CompletionService的实现目标是任务先完成可优先获取到,即结果按照完成先后顺序排序。

主要的代码实现如下:
//先创建一个线程池
ScheduledExecutorService blackListCheckExecutorService = new ScheduledThreadPoolExecutor(20,
new BasicThreadFactory.Builder().namingPattern("multi-black-list-decision-%d").build());
//定义一个CompletionService,返回值为boolean类型
CompletionService<Boolean> completionService = new ExecutorCompletionService<>(blackListCheckExecutorService);
//把要执行的任务提交给completionService
for (String blackListName : multiBlackListDecisionObject.getBlackListNames()) {
completionService.submit(() -> getData(new BlackListDecisionObject(multiBlackListDecisionObject, blackListName)) != null);
}
try {
int tasks = multiBlackListDecisionObject.getBlackListNames().size();
//再循环中不断尝试get返回结构
while (tasks > 0) {
Future<Boolean> future = completionService.take();
boolean result = future.get();
//拿到一个结果后就判断是否为true
//只要有一个为true直接返回true
if (result) {
return true;
}
tasks--;
}
//都执行完之后,没有true,则最终返回一次false
return false;
} catch (InterruptedException | ExecutionException e) {
return false;
}