软件编程
位置:首页>> 软件编程>> java编程>> java利用Future实现多线程执行与结果聚合实例代码

java利用Future实现多线程执行与结果聚合实例代码

作者:坚持是一种态度  发布时间:2023-09-24 11:07:18 

标签: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<String, Object> map, Map<String, Object> 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();
           }
       }
   }

来源:https://blog.csdn.net/u010882234/article/details/122127152

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com