java利用Future实现多线程执行与结果聚合的代码怎么写
发表于:2025-01-18 作者:千家信息网编辑
千家信息网最后更新 2025年01月18日,java利用Future实现多线程执行与结果聚合的代码怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。场景网站智能问答场景,需要
千家信息网最后更新 2025年01月18日java利用Future实现多线程执行与结果聚合的代码怎么写
java利用Future实现多线程执行与结果聚合的代码怎么写,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
场景
网站智能问答场景,需要对多个分类查询,结果聚合展示
由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticsearch搜索引擎,有的需要调用第三方接口,数据查询要分开进行,没法一次查询搞定
实际上这几个查询不相关,可以同时进行,现在串行,使该场景下,智能问答返回较慢
解决
最简单的逻辑,肯定就是java多线程,将串行改为并行
这样查询返回时间,就取决于最慢的一个查询,返回时间大大缩短
页面返回一般要求三秒内,实际项目上我们要求1秒内返回,多线程解决了这个问题
下面上代码,部分截取
@Autowired private ThreadPoolTaskExecutor taskExecutor;
// 新闻查询 SolrPageQueryVO newsQueryVO = new SolrPageQueryVO(); BeanUtil.copyProperties(vo, newsQueryVO); newsQueryVO.setAllSite(vo.getAllSite()); newsQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.articleNews.toString().concat(",") .concat(SolrPageQueryVO.TypeCode.pictureNews.toString()) .concat(",").concat(SolrPageQueryVO.TypeCode.videoNews.toString())); Future> newsFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, newsQueryVO, "news", context)); //网上服务 Future> workGuideFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, vo, "workGuide", context)); //留言 SolrPageQueryVO messageBoardQueryVO = new SolrPageQueryVO(); BeanUtil.copyProperties(vo, messageBoardQueryVO); messageBoardQueryVO.setAllSite(vo.getAllSite()); messageBoardQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.messageBoard.toString()); Future> messageBoardFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, messageBoardQueryVO, "messageBoard", context)); //信息公开(isAllSite为true时,搜索所有集合,不区分集合和站点,只根据dn搜索,有区分需要的项目可以重写SearchEsServiceImpl类) SolrPageQueryVO publicContentQueryVO = new SolrPageQueryVO(); BeanUtil.copyProperties(vo, publicContentQueryVO); publicContentQueryVO.setAllSite(vo.getAllSite()); publicContentQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.public_content.toString()); Future> publicContentFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, publicContentQueryVO, "public_content", context)); //问答知识库(isAllSite为true时,搜索所有集合,不区分集合和站点,有区分需要的项目可以重写或传false) SolrPageQueryVO knowledgeBaseQueryVO = new SolrPageQueryVO(); BeanUtil.copyProperties(vo, knowledgeBaseQueryVO); knowledgeBaseQueryVO.setAllSite(vo.getAllSite()); knowledgeBaseQueryVO.setTypeCode(SolrPageQueryVO.TypeCode.knowledgeBase.toString()); Future> knowledgeBaseFuture = taskExecutor.submit(()->selectForAsk(map, sumMap, knowledgeBaseQueryVO, "knowledgeBase", context)); try { knowledgeBaseFuture.get(); } catch (Exception e) { e.printStackTrace(); } try { messageBoardFuture.get(); } catch (Exception e) { e.printStackTrace(); } try { newsFuture.get(); } catch (Exception e) { e.printStackTrace(); } try { publicContentFuture.get(); } catch (Exception e) { e.printStackTrace(); } try { workGuideFuture.get(); } catch (Exception e) { e.printStackTrace(); } tabcount = sumMap.values().size(); map.put("tabcount", tabcount); map.put("numMap", sumMap);
private void selectForAsk(Mapmap, Map sumMap, SolrPageQueryVO vo, String type, Context context) { if ("news".equals(type)) { try { // do something } catch (Exception e) { e.printStackTrace(); } } else if ("workGuide".equals(type)) { try { //网上办事查询调用接口 // do something } catch (Exception e) { e.printStackTrace(); } } else if ("messageBoard".equals(type)) { try { // do something } catch (Exception e) { e.printStackTrace(); } } else if ("public_content".equals(type)) { try { Long queryCount = SearchQueryHolder.queryCount(vo); // do something } catch (Exception e) { e.printStackTrace(); } } else if ("knowledgeBase".equals(type)) { try { // do something } catch (Exception e) { e.printStackTrace(); } } }
关于java利用Future实现多线程执行与结果聚合的代码怎么写问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
查询
线程
问题
搜索
结果
项目
问答
代码
场景
实际
接口
数据
时间
智能
更多
知识
站点
逻辑
分类
帮助
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
wow最大服务器
鲍鱼秀场软件开发
软件开发项目结算书
ftp服务器的安全性
数据库应用系统中心的核心问题是
微信服务器防护
加强敏感信息排查确保网络安全
武汉蓝牙网络技术公司
网络安全防御环
网络安全征文稿500字以上
挖矿蠕虫连接服务器
git服务器管理工具下载
游戏哪些数据是放在服务器的
那些软件有ORACLE数据库
国外服务器厂家
软件开发人员产值分析
马鞍山服务器回收公司来电咨询
为网络安全设计标语
5S数据库怎么修复
计算机网络技术资格证好考吗
服务器的并发是什么
数据库管理系统英文表
数据库表修复
域成员服务器
网络技术培训项目
网络安全手抄报简单的文字
贵阳服务器租用南沙人才
腾讯的轻量服务器是k8吗
维普专利数据库
c 数据库界面生成器