java利用Future實現(xiàn)多線程執(zhí)行與結(jié)果聚合實例代碼
場景
網(wǎng)站智能問答場景,需要對多個分類查詢,結(jié)果聚合展示
由于每種分類都有自己的業(yè)務(wù)邏輯,有的需要查詢數(shù)據(jù)庫中間庫,有的需要查詢elasticsearch搜索引擎,有的需要調(diào)用第三方接口,數(shù)據(jù)查詢要分開進行,沒法一次查詢搞定
實際上這幾個查詢不相關(guān),可以同時進行,現(xiàn)在串行,使該場景下,智能問答返回較慢
解決
最簡單的邏輯,肯定就是java多線程,將串行改為并行
這樣查詢返回時間,就取決于最慢的一個查詢,返回時間大大縮短
頁面返回一般要求三秒內(nèi),實際項目上我們要求1秒內(nèi)返回,多線程解決了這個問題
下面上代碼,部分截取
@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)); //網(wǎng)上服務(wù) 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時,搜索所有集合,不區(qū)分集合和站點,只根據(jù)dn搜索,有區(qū)分需要的項目可以重寫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時,搜索所有集合,不區(qū)分集合和站點,有區(qū)分需要的項目可以重寫或傳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 { //網(wǎng)上辦事查詢調(diào)用接口 // 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(); } } }
總結(jié)
到此這篇關(guān)于java利用Future實現(xiàn)多線程執(zhí)行與結(jié)果聚合的文章就介紹到這了,更多相關(guān)java?Future實現(xiàn)多線程執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java URL 獲取PHP JSON 數(shù)據(jù)
這篇文章主要介紹了java URL 獲取PHP JSON 數(shù)據(jù),需要的朋友可以參考下2016-04-04java面向?qū)ο笤O(shè)計原則之單一職責(zé)與依賴倒置原則詳解
這篇文章主要介紹了java面向?qū)ο笤O(shè)計原則之單一職責(zé)與依賴倒置原則的分析詳解,有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進步早日升職加薪2021-10-10springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn)
本文主要介紹了springboot使用RedisRepository操作數(shù)據(jù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05java.lang.StackOverflowError出現(xiàn)的原因及解決
這篇文章主要介紹了java.lang.StackOverflowError出現(xiàn)的原因及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07