首页 > 作文

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

更新时间:2023-04-04 07:13:29 阅读: 评论:0

目录
场景解决总结

场景

网站智能问答场景,需要对多个分类查询,结果聚合展示

由于每种分类都有自己的业务逻辑,有的需要查询数据库中间库,有的需要查询elasticarch搜索引擎,有的需要调用第三方接口,数据查询要分开进行,没法一次查询搞定

实际上这几个查询不相关,可以同时进行,现在串行,使该场景下,智能问答返回较慢

解决

最简单的逻辑,肯定就是java多线程,将串行改为并行

这样查询返回时间,就取决于最慢的一个查询,返回时间大大缩短

页面返回一般要求三秒内,实际项目上我们要求1秒内返回,多线程解决了这个问题

下面上代码,部分截取

@autowired    private threadpooltaskexecutor taskexecutor;
// 新闻查询            solrpagequeryvo newsqueryvo = new solrpagequeryvo();            beanutil.copyproperties(vo, newsqueryvo);            newsqueryvo.tallsite(vo.getallsite());            newsqueryvo.ttypecode(solrpagequeryvo.typecode.articlenews.tostring().concat(",")                    .concat(solrpagequeryvo.typecode.picturenews.tostring())                    .concat(",").concat(solrpagequeryvo.typecode.videonews.tostring()));            future<?> newsfuture = taskexecutor.submit(()->lectforask(map, summap, newsqueryvo, "news", context));            //网上服务            futu地名大全re<?> workguidefuture = taskexecutor.submit(()->lectforask(map, summap, vo, "workguide", context));            //留言            solrpagequeryvo messageboardqueryvo = new solrpagequeryvo();            beanutil.copyproperties(vo, messageboardqueryvo);            messageboardqueryvo.tallsite(vo.getallsite());            messageboardqueryvo.ttypecode(solrpagequeryvo.typecode.messageboard.tostring());            future<?> messageboardfuture = taskexecutor.submit(()->lectforask(map, summap, messageboardqueryvo, "messageboard", context));            //信息公开(isallsite为true时,搜索所有集合,不区分集合和站点,只根据dn搜索,有区分需要的项目可以重写archesrviceimpl类)            solrpagequeryvo publiccontentqueryvo = new solrpagequeryvo();            beanutil.copyproperties(vo, publiccontentqueryvo);            publiccontentqueryvo.tallsite(vo.getallsite());            publiccontentqueryvo.ttypecode(solrpagequeryvo.typecode.public_content.tostring());            future<?> publiccontentfuture = taskexecutor.submit(()->lectforask(map, summap, publiccontentqueryvo, "public_content", context));            //问答知识库(isallsite为true时,搜索所有集合,不区分集合和站点,有区分需要的项目可以重写或传fal)            solrpagequeryvo knowledgebaqueryvo = new solrpagequeryvo();            beanutil.copyproperties(vo, knowledgebaqueryvo);            knowledgebaqueryvo.耄耋老人tallsite(vo.getallsite());           培训需求调研表 knowledgebaqueryvo.ttypecode(solrpagequeryvo.typecode.knowledgeba.tostring());            future<?> knowledgebafuture = taskexecutor.submit(()->lectforask(map, summap, knowledgebaqueryvo, "knowledgeba", context));            try {                knowledgebafuture.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 {                workguidefu广西壮族自治区招生考试院ture.get();            } catch (exception e) {                e.printstacktrace();            }            tabcount = summap.values().size();            map.put("tabcount", tabcount);            map.put("nummap", summap);
 private void lectforask(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();            }        } el if ("workguide".equals(type)) {            try {                //网上办事查询调用接口               // do something            } catch (exception e) {                e.printstacktrace();            }        } el if ("messageboard".equals(type)) {            try {                // do something            } catch (exception e) {                e.printstacktrace();            }        } el if ("public_content".equals(type)) {       春秋地图     try {                long querycount = archqueryholder.querycount(vo);                // do something            } catch (exception e) {                e.printstacktrace();            }        } el if ("knowledgeba".equals(type)) {            try {                // do something            } catch (exception e) {                e.printstacktrace();            }        }    }

总结

到此这篇关于java利用future实现多线程执行与结果聚合的文章就介绍到这了,更多相关javafuture实现多线程执行内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 07:13:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/e25e5f4ca1dc7f3a89771301c76df7f7.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:java利用Future实现多线程执行与结果聚合实例代码.doc

本文 PDF 下载地址:java利用Future实现多线程执行与结果聚合实例代码.pdf

标签:多线程   场景   问答   重写
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图