并发调三个方法,实现只要有一个成功就立即成功,否则等都失败才失败
典型回答 有的时候,我们需要实现这样的功能,比如说我们有多个黑名单需要校验,为了提升效率,需要并发执行,执行过程中,如果有结果先返回了,就判断他是否命中了黑名单,如果命中,则不用再等后续的其他请求了,直接拒绝即可,否则就要等所有的请求都返回,所有的返回都是通过,返回通过。 想要实现这个功能,可以借助CompletionService。 CompletionService是Java8的新增接口,JDK为其提供了一个实现类ExecutorCompletionService。这个类是为线程池中Task的执行结果服务的,即为Executor中Task返回Future而服务的。 CompletionService的实现目标是任务先完成可优先获取到,即结果按照完成先后顺序排序。 主要的代码实现如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 //先创建一个线程池 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; }