java使用CompletableFuture分批處理任務(wù)實(shí)現(xiàn)
一、無(wú)返回值任務(wù)函數(shù)
// 數(shù)據(jù)分批 List<List<StatisticsDTO>> batches = Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<Void>> futures = new ArrayList<>(batches.size()); // 數(shù)據(jù)處理 for (int i = 0; i < batches.size(); i++) { logger.info("批次 " + i + " 開(kāi)始處理..."); String logId = LogIdThreadLocal.getLogId(); // 傳遞主線程的 logId List<StatisticsDTO> batchData = batches.get(i); CompletableFuture<Void> future = CompletableFuture.runAsync(() -> { try { LogIdThreadLocal.setLogId(logId); processBatch(batchData); } finally { LogIdThreadLocal.clean(); } }); futures.add(future); } // 等待所有的異步任務(wù)完成 CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); allOf.join();
二、帶返回值任務(wù)函數(shù)
// 數(shù)據(jù)分批 List<List<StatisticsDTO>> batches = Lists.partition(statisticsList, BATCH_SIZE); List<CompletableFuture<List<StatisticsDTO>>> futures = new ArrayList<>(batches.size()); // 數(shù)據(jù)處理 for (int i = 0; i < batches.size(); i++) { logger.info("批次 " + i + " 開(kāi)始處理..."); String logId = LogIdThreadLocal.getLogId(); // 傳遞主線程的 logId List<StatisticsDTO> batchData = batches.get(i); CompletableFuture<List<DoctorAvatarAnalysisDTO>> future = CompletableFuture.supplyAsync(() -> { try { LogIdThreadLocal.setLogId(logId); return processBatch(batchData); } finally { LogIdThreadLocal.clean(); } }); futures.add(future); } // 等待所有 CF 完成并合并結(jié)果 CompletableFuture<Void> allOf = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])); List<StatisticsDTO> result = allOf.thenApply( v -> futures.stream().map(CompletableFuture::join).flatMap(List::stream).collect(Collectors.toList()) ).join();
到此這篇關(guān)于java使用CompletableFuture分批處理任務(wù)實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)java CompletableFuture分批處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例
WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議,允許服務(wù)器主動(dòng)向客戶(hù)端推送信息,同時(shí)也能從客戶(hù)端接收信息,本文主要介紹了SpringBoot+WebSocket向前端推送消息的實(shí)現(xiàn)示例,感興趣的可以了解一下2024-08-08基于Java設(shè)計(jì)一個(gè)高并發(fā)的秒殺系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了如何基于Java設(shè)計(jì)一個(gè)高并發(fā)的秒殺系統(tǒng),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以參考下2023-10-10Java基礎(chǔ)知識(shí)精通二維數(shù)組的應(yīng)用
為了方便組織各種信息,計(jì)算機(jī)常將信息以表的形式進(jìn)行組織,然后再以行和列的形式呈現(xiàn)出來(lái)。二維數(shù)組的結(jié)構(gòu)決定了其能非常方便地表示計(jì)算機(jī)中的表,以第一個(gè)下標(biāo)表示元素所在的行,第二個(gè)下標(biāo)表示元素所在的列。下面簡(jiǎn)單了解一下二維數(shù)組,包括數(shù)組的聲明和初始化2022-04-04springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解
這篇文章主要為大家介紹了springboot中使用Hibernate-Validation校驗(yàn)參數(shù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07java封裝類(lèi)型與基礎(chǔ)類(lèi)型對(duì)比示例分析
這篇文章主要為大家介紹了java封裝類(lèi)型與基礎(chǔ)類(lèi)型對(duì)比示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)
下面小編就為大家?guī)?lái)一篇java中進(jìn)程與線程_三種實(shí)現(xiàn)方式總結(jié)(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06