多線程工具類ExecutorService的使用(所有任務執行完成后獲取最終結果)

我們經常會有這種需求,比如APP首頁,需要同時加載20多個接口,你怎么做?一個個按順序調用接口嗎?如果網絡通暢還好,如果網絡不好,你可能會讓首頁加載幾分鐘,用戶體驗肯定不好,那么我們就需要使用多線程來做。那假設其中有幾個接口需要都執行完了,你才能繼續執行后面的代碼,怎么做?那這時候就需要?ExecutorService中的? <T> Future<T> submit(Callable<T> task);方法了。

1.工具類FutureUtils.java

/*** */
package com.figo.html5.future;import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;/*** 多線程執行任務 .* * @author figo . 20190711 add .*/
public class FutureUtils{/*** SUCCESS .*/public static final String SUCCESS="1";/*** * @param tasks .* @return .*/public static boolean useFuture(List<BaseTask> tasks) {long start = System.currentTimeMillis();// 固定線程池線程個數ExecutorService executor = Executors.newFixedThreadPool(tasks.size());for(BaseTask task:tasks){executor.submit(task);}executor.shutdown();while (true) {if (executor.isTerminated()) {long end = System.currentTimeMillis();System.out.println("所有任務執行完畢,總耗時(毫秒):" + (end - start));return true;}try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}
}

2.BaseTask.java任務基類

package com.figo.html5.future;import java.util.List;
import java.util.concurrent.Callable;/** * BaseTask.java .* * @author  figo.zhu .* @serial  .* @param <T> .* @since 2019年7月11日 下午3:37:57 .*/
public abstract class BaseTask<T> implements Callable<T> {/*** result list .*/List<T> listResult;/*** result .*/T result;/*** * @return .*/public List<T> getListResult() {return listResult;}/*** * @param listResult .*/public void setListResult(List<T> listResult) {this.listResult = listResult;}/*** * @return .*/public T getResult() {return result;}/*** * @param result .*/public void setResult(T result) {this.result = result;}}

3.其中一個任務,查詢商戶開通的支付銀行列表?QueryMerBankConfigTask.java,其他相似

/** * QueryMerBankConfigTask.java* * @author  sun.jun* @serial * @since 2019年7月11日 下午3:47:31*/
package com.figo.html5.future;import java.util.List;import com.figo.service.impl.APBusServiceImpl;
import com.figo.util.log.MonitorLogger;/** * QueryMerBankConfigTask.java .* * @author  figo.zhu .* @serial * @since 2019年7月11日 下午3:47:31 .*/
public class QueryMerBankConfigTask extends BaseTask<String> {/*** 日志.*/private MonitorLogger logger = MonitorLogger.getLogger(QueryMerBankConfigTask.class);/*** merId .*/String merId;/*** tranType .*/String tranType;/*** * @param merId .* @param tranType .*/public  QueryMerBankConfigTask(String merId,String tranType){this.merId=merId;this.tranType=tranType;}/*** call .* @return String .* @exception Exception .*/@Overridepublic String call() throws Exception {try {long start = System.currentTimeMillis();List<String> bankInstNoList = new APBusServiceImpl().getPayMode(merId, tranType);this.listResult=bankInstNoList;long end = System.currentTimeMillis();System.out.println("getPayMode任務執行完畢,耗時(毫秒):" + (end - start));logger.info(merId+","+tranType+"配置的支付機構:"+bankInstNoList);return "1";} catch (Exception e) {logger.error("QueryMerBankConfigTask Exception:" + e.getStackTrace());return "0";}}}

4.調用(偽代碼,自行調通)

boolean isFinished=FutureUtils.useFuture(tasks);//所有任務結束,獲取支付結果if(isFinished){bankInstNoListFor0001=queryMerBankConfigTaskFor0001!=null?queryMerBankConfigTaskFor0001.getListResult():bankInstNoListFor0001;bankInstNoListFor0004=queryMerBankConfigTaskFor0004!=null?queryMerBankConfigTaskFor0004.getListResult():bankInstNoListFor0004;bankInstNoListFor0005=queryMerBankConfigTaskFor0005!=null?queryMerBankConfigTaskFor0005.getListResult():bankInstNoListFor0005;bankInstNoListFor0008=queryMerBankConfigTaskFor0008!=null?queryMerBankConfigTaskFor0008.getListResult():bankInstNoListFor0008;whetherSupportItemFlag=queryItemFlagTask!=null?queryItemFlagTask.getResult():false;fcBankInstNoList =queryAllForeignCardBanksTask!=null?queryAllForeignCardBanksTask.getListResult():fcBankInstNoList;}

關鍵是調用executor.isTerminated()來判斷所有線程是否已經執行完成。

if (executor.isTerminated()) {
?? ??? ??? ??? ?long end = System.currentTimeMillis();
?? ??? ??? ??? ?System.out.println("所有任務執行完畢,總耗時(毫秒):" + (end - start));
?? ??? ??? ??? ?return true;
?? ??? ??? ?}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163316.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

來聊聊JVM中的類加載過程以及雙親委派模型(學習Java必知內容)

文章目錄 1. 類加載過程加載驗證準備解析初始化 2. 雙親委派模型一個類的加載流程雙親委派模型的優點 總結 1. 類加載過程 在整個 JVM 執行過程中, 和我們程序員關系最密切的就是類加載的過程, 所以接下來我們來看下類加載的執行流程. 對于一個類來說, 它的生命周期是這樣的:…

python pymodbus庫使用教程(以Modbus RTU為例)

文檔&#xff1a; https://pymodbus.readthedocs.io/en/latest/ 源碼&#xff1a; https://github.com/riptideio/pymodbus/ 文章目錄 Python PyModbus庫使用教程&#xff1a;以Modbus RTU為例介紹安裝PyModbus配置串行連接導入必要的模塊創建Modbus客戶端實例 建立連接連接…

UEC++ day8

傷害系統 給敵人創建血條 首先添加一個UI界面用來顯示敵人血條設置背景圖像為黑色半透明 填充顏色 給敵人類添加兩種狀態表示血量與最大血量&#xff0c;添加一個UWidegtComponet組件與UProgressBar組件 UPROPERTY(EditAnywhere, BlueprintReadWrite, Category "Enemy …

TikTok歷史探秘:短視頻中的時間之旅

在數字時代的浪潮中&#xff0c;TikTok嶄露頭角&#xff0c;成為社交媒體領域的一顆耀眼新星。這款短視頻應用以其獨特的創意、時尚和娛樂性質&#xff0c;吸引了全球數以億計的用戶。 然而&#xff0c;TikTok并非一夜之間的奇跡&#xff0c;它背后蘊藏著豐富而有趣的歷史故事…

[ChatGPT]ChatGPT免費,不用翻墻!?——你需要的裝備

系列文章目錄 【AIGC】服務于人類&#xff5c;一種新的人工智能技術-CSDN博客 文章目錄 目錄 系列文章目錄 文章目錄 前言 一、天意云網站 ?編輯 二、使用步驟 可以看到有云服務器、Rstudio以及我們的ChatGPT&#xff0c;我這次主要分享ChatGPT&#xff0c;其他的有機會我再給…

常用服務注冊中心與發現(Eurake、zookeeper、Nacos)筆記(一)基礎概念

基礎概念 注冊中心 在服務治理框架中&#xff0c;通常都會構建一個注冊中心&#xff0c;每個服務單元向注冊中心登記自己提供的服務&#xff0c;將主機與端口號、版本號、通信協議等一些附加信息告知注冊中心&#xff0c;注冊中心按照服務名分類組織服務清單&#xff0c;服務…

電力感知邊緣計算網關產品設計方案-軟件架構(業務流程)

軟件架構(業務流程) 基于前端系統提供的硬件通信平臺,后端系統以控制執行單元為核心,協同控制通信管理、驅動適配、存儲單元等職能單元完成與前端系統的通信數據交互業務,在經歷以下業務流程后,完成設備自適應通信業務功能。 1.外部設備通信前端系統 前端系統連接新的…

OpenAI

OpenAI&#xff0c;在美國成立的人工智能研究公司&#xff0c;核心宗旨在于“實現安全的通用人工智能(AGI)”&#xff0c;使其有益于人類。 OpenAI于2015年由一群科技領袖&#xff0c;包括山姆阿爾特曼&#xff08;Sam Altman&#xff09;、彼得泰爾&#xff08;Peter Thiel&a…

設計師不能忽視的幾個寶藏圖標設計工具

在這個快速變化的時代&#xff0c;設計師對創新和實用工具的需求越來越大。這就要求我們及時跟上潮流&#xff0c;不斷探索和嘗試最新、最有價值的圖標設計工具。只有這樣&#xff0c;我們才能在競爭激烈的設計市場中脫穎而出。以下是我們精心挑選的2024年值得一試的圖標設計工…

C語言實現求n以內最大的k個素數c

以下是C語言實現求n以內最大的k個素數的代碼&#xff1a; #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <math.h>bool is_prime(int num) { // 判斷素數int i;if(num < 2) {return false;}for(i 2; i < sqrt(num); …

服務器安全如何保障

主機安全是指保護計算機主機&#xff08;也稱為服務器、終端或主機設備&#xff09;免受潛在的安全威脅和攻擊的一系列措施和實踐。主機安全旨在防止未經授權的訪問、數據泄露、惡意軟件感染和其他安全漏洞的利用&#xff0c;主機一旦被黑客入侵&#xff0c;企業會面臨很多安全…

相比其他關系型數據庫,AntDB JDBC驅動特性有哪些不同之處

摘要&#xff1a;使用Java語言進行各類應用程序的快速開發成為目前比較主要且流行的開發方式。JDBC是 Java 語言中用來連接和操作關系型數據庫的 API&#xff0c;在業務程序與關系型數據庫通信時&#xff0c;必然會使用JDBC驅動。 本文將通過國產關系型數據庫AntDB中的JDBC為大…

【Effective C++】 (六) 繼承與面向對象設計

【六】繼承與面向對象設計 條款32 &#xff1a; 確保public繼承是"is a"的關系 Item 32: Make sure public inheritance models “is-a”. C面向對象程序設計中&#xff0c;最重要的規則便是&#xff1a;public繼承應當是"is-a"的關系。當Derived public繼…

3.1.2 Linux時間子系統 hrtimer示例使用

文章目錄 結構體定義接口初始化啟動修改取消示例示例1示例2示例3結構體定義 struct hrtimer {struct timerqueue_node node;ktime_t _softexpires;enum hrtimer_restart

生成目錄結構圖 tree命令

tree /f >info.txt tree命令可用于生成漂亮的目錄結構圖&#xff0c;在此之前&#xff0c;我一直以為是手打的…… .| index.html|\---static---css| bar.css| map.css| \---js

jQuery創建、插入、刪除對象

jQuery庫中的一些操作元素的方法 創建元素&#xff1a; $(htmlString)&#xff1a;這個構造器可以用來創建元素&#xff0c;其中htmlString是一個包含HTML標記的字符串。例如&#xff0c;$(<p>Hello, World!</p>)會創建一個<p>元素對象&#xff1b;$("&…

【uniapp】部分圖標點擊事件無反應

比如&#xff1a;點擊這個圖標在h5都正常&#xff0c;在小程序上無反應 css&#xff1a;也設置z-index&#xff0c;padding 頁面上也試過click.native.stop.prevent"changePassword()" 時而可以時而不行&#xff0c; 最后發現是手機里輸入鍵盤的原因&#xff0c;輸…

大型養殖場需要哪些污水處理設備

大型養殖場是一個涉及環境保護和可持續發展的關鍵行業&#xff0c;對于處理養殖場產生的污水有著明確的要求和標準。為了確保污水得到有效處理和處理效果達到國家排放標準&#xff0c;大型養殖場需要配備一系列污水處理設備。以下是幾種常見的污水處理設備&#xff1a; 1. 水解…

Python入門指南之基本概率和語法基礎

文章目錄 一、基本概念二、控制流三、函數四、模塊五、數據結構六、面向對象的編程七、輸入輸出八、異常九、Python標準庫關于Python技術儲備一、Python所有方向的學習路線二、Python基礎學習視頻三、精品Python學習書籍四、Python工具包項目源碼合集①Python工具包②Python實戰…

快速排序演示和代碼介紹

快速排序的核心是(以升序為例)&#xff1a;在待排序的數據中指定一個數做為基準數&#xff0c;把所有小于基準數的數據放到基準數的左邊&#xff0c;所有大于基準數的數據放在右邊&#xff0c;這樣的話基準數的位置就確定了&#xff0c;然后在兩邊的數據中重復上述操作