最近工作中有需要短时间内提交大量请求,并获取响应结果,最终选择了CompletionService接口来实现,它整合了Executor和BlockingQueue的功能。你可以将Callable任务提交给它去执行,然后使用类似于队列中的take方法获取线程的返回值。具体jdk的解释是:将生产新的异步任务与使用已完成任务的结果分离开来的服务。生产者 submit 执行的任务。使用者 take 已完成的任务,并按照完成这些任务的顺序处理它们的结果。例如,CompletionService 可以用来管理异步 IO ,执行读操作的任务作为程序或系统的一部分提交,然后,当完成读操作时,会在程序的不同部分执行其他操作,执行操作的顺序可能与所请求的顺序不同。
以下是示例代码
public List<JSONObject> getDataCompletionService(List<JSONObject> paramters){
//使用线程池,具体corePoolSize:活跃线程数,maximumPoolSize最大线程数根据需要自己定义
ThreadPoolExecutor t=new ThreadPoolExecutor(4,8,
2000L, TimeUnit.SECONDS,new LinkedBlockingQueue<>());
CompletionService<JSONObject> cs = new ExecutorCompletionService<JSONObject>(t);
for(int i =0;i<paramters.size();i++){
int j=i;
cs.submit(new Callable<JSONObject>() {
public JSONObject call() throws Exception {
JSONObject jsonObject1 =new JSONObject();
//具体业务逻辑实现
return jsonObject1;
}
});
}
for(int i =0;i<paramters.size();i++) {
try {
jsonObjects.add(cs.take().get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
t.shutdown();
return jsonObjects;
}
}
有需要的可以以这个例子作为参考,后面会学习通过Java8的CompletableFuture来解决问题。
版权声明:本文为jiangxiaohe123原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。