中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java利用Future實現多線程執行與結果聚合的代碼怎么寫

發布時間:2021-12-27 12:28:43 來源:億速云 閱讀:199 作者:柒染 欄目:開發技術

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();
            }
        }
    }

關于java利用Future實現多線程執行與結果聚合的代碼怎么寫問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

额敏县| 江都市| 荣成市| 宣化县| 荣昌县| 县级市| 墨竹工卡县| 安乡县| 张家港市| 确山县| 满洲里市| 冀州市| 水城县| 如东县| 巩义市| 富裕县| 巴塘县| 霍州市| 綦江县| 和静县| 尚义县| 肃宁县| 武强县| 绥芬河市| 无为县| 恩施市| 光山县| 余江县| 焦作市| 通州区| 璧山县| 寻乌县| 太保市| 忻城县| 白山市| 黔东| 常德市| 玉屏| 安吉县| 犍为县| 翁牛特旗|