java多线程提交任务并返回结果
最近工作中有需要短时间内提交大量请求,并获取响应结果,最终选择了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来解决问题。
作者:寒溏度
来源链接:https://blog.csdn.net/jiangxiaohe123/article/details/81749173
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。