最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合實(shí)例代碼

 更新時(shí)間:2021年12月26日 08:51:12   作者:堅(jiān)持是一種態(tài)度  
這篇文章主要給大家介紹了關(guān)于java利用Future實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合的相關(guān)資料,Future模式的核心,去除了主函數(shù)的等待時(shí)間,并使得原本需要等待的時(shí)間段可以用于處理其他業(yè)務(wù)邏輯,需要的朋友可以參考下

場景

網(wǎng)站智能問答場景,需要對多個分類查詢,結(jié)果聚合展示

由于每種分類都有自己的業(yè)務(wù)邏輯,有的需要查詢數(shù)據(jù)庫中間庫,有的需要查詢elasticsearch搜索引擎,有的需要調(diào)用第三方接口,數(shù)據(jù)查詢要分開進(jìn)行,沒法一次查詢搞定

實(shí)際上這幾個查詢不相關(guān),可以同時(shí)進(jìn)行,現(xiàn)在串行,使該場景下,智能問答返回較慢

解決

最簡單的邏輯,肯定就是java多線程,將串行改為并行

這樣查詢返回時(shí)間,就取決于最慢的一個查詢,返回時(shí)間大大縮短

頁面返回一般要求三秒內(nèi),實(shí)際項(xiàng)目上我們要求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時(shí),搜索所有集合,不區(qū)分集合和站點(diǎn),只根據(jù)dn搜索,有區(qū)分需要的項(xiàng)目可以重寫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時(shí),搜索所有集合,不區(qū)分集合和站點(diǎn),有區(qū)分需要的項(xiàng)目可以重寫或傳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實(shí)現(xiàn)多線程執(zhí)行與結(jié)果聚合的文章就介紹到這了,更多相關(guān)java?Future實(shí)現(xiàn)多線程執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)API接口的完整代碼

    SpringBoot實(shí)現(xiàn)API接口的完整代碼

    這篇文章主要給大家介紹了關(guān)于SpringBoot實(shí)現(xiàn)API接口的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 詳解Java編程中對線程的中斷處理

    詳解Java編程中對線程的中斷處理

    這篇文章主要介紹了Java編程中對線程的中斷處理,特別講解了中斷的時(shí)機(jī)與中斷狀態(tài)的管理,需要的朋友可以參考下
    2015-11-11
  • spring boot org.junit.jupiter.api不存在的解決

    spring boot org.junit.jupiter.api不存在的解決

    這篇文章主要介紹了spring boot org.junit.jupiter.api不存在的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java原生序列化和反序列化代碼實(shí)例

    Java原生序列化和反序列化代碼實(shí)例

    這篇文章主要介紹了Java原生序列化和反序列化代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • springBoot啟動時(shí)讓方法自動執(zhí)行的幾種實(shí)現(xiàn)方式

    springBoot啟動時(shí)讓方法自動執(zhí)行的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了springBoot啟動時(shí)讓方法自動執(zhí)行的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • java中flatMap用法完整示例

    java中flatMap用法完整示例

    flatMap是java8的Stream流的一個方法,下面這篇文章主要給大家介紹了關(guān)于java中flatMap用法的相關(guān)資料,文中通過示例代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • Java8如何通過Lambda處理List集合

    Java8如何通過Lambda處理List集合

    這篇文章主要介紹了java8如何通過Lambda處理List集合,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java 設(shè)計(jì)模式之適配器模式詳解

    Java 設(shè)計(jì)模式之適配器模式詳解

    設(shè)計(jì)模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)。使用設(shè)計(jì)模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-11-11
  • QueryWrapper中or的使用技巧分享

    QueryWrapper中or的使用技巧分享

    在日常的開發(fā)工作中,處理數(shù)據(jù)庫查詢是一個非常常見的任務(wù),尤其是當(dāng)我們需要在復(fù)雜條件下篩選數(shù)據(jù)時(shí),如何編寫高效、簡潔且可維護(hù)的查詢邏輯顯得尤為重要,本文給大家介紹了QueryWrapper中or的使用技巧,需要的朋友可以參考下
    2024-10-10
  • Spring Boot2配置Swagger2生成API接口文檔詳情

    Spring Boot2配置Swagger2生成API接口文檔詳情

    這篇文章主要介紹了Spring Boot2配置Swagger2生成API接口文檔詳情,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評論

奈曼旗| 阳城县| 霍山县| 神池县| 盐源县| 卢湾区| 达孜县| 台南市| 连城县| 井冈山市| 喀喇| 北川| 石柱| 石泉县| 延安市| 水城县| 砚山县| 太湖县| 芒康县| 临桂县| 吉林市| 嘉义县| 咸丰县| 调兵山市| 广宁县| 绥棱县| 台东县| 柘荣县| 九寨沟县| 宕昌县| 周宁县| 汉中市| 休宁县| 双峰县| 美姑县| 贡觉县| 苏尼特左旗| 东丽区| 姜堰市| 阳信县| 溆浦县|