千家信息网

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(Map map, 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实现多线程执行与结果聚合的代码怎么写问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

0