多线程工具类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.mzph.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;然后在两边的数据中重复上述操作