java 线程 主进程_java 多线程通用方法
写了一个多线程的通用调用方法,只需要传入请求参数List和调用的方法即可通过多线程得到返回结果list,
适用于同一个方法被调用多次的情况。
1:首先创建一个接口
@FunctionalInterface
public interface MyFunction {
R doFunction(T t);
}
2:创建一个实现类
public class AsyncFunctionImpl {
public static List asyncFunction(List inputList, MyFunction function)
{
// 创建一个线程大小与集合数量相等的线程池
ExecutorService pool = Executors.newFixedThreadPool(inputList.size());
// 创建Future的list集合,用以接收返回值
List list = new ArrayList();
for (int i = 0; i < inputList.size(); i++) {
// 执行任务并获取Future对象,这里采用lambda表达式替代Callable接口的实现
// getName(input)就是你要执行业务逻辑的方法,返回值需要用f.get()获取
int finalI = i;
Future f = pool.submit(() -> function.doFunction(inputList.get(finalI)));
list.add(f);
}
// 关闭线程池
pool.shutdown();
// 循环获取所有并发线程的任务结果
//FAKE_ROUND_WAY
List outputList = new ArrayList<>();
for (Future f : list) {
// 从Future对象上获取任务的返回值,返回一个实体类,需要进行强制转换
//f.get()会一直阻塞主进程,直到业务逻辑方法执行结束
try {
outputList.add((R)f.get());
} catch (InterruptedException e) {
throw new ApiException(e.getMessage());
} catch (ExecutionException e) {
throw new ApiException(e.getMessage());
}
}
return outputList;
}
}
3:调用
public static void main(String[] args) {
List inputList = new ArrayList<>();
//首先我们构造一个请求参数的集合
for (int i = 0; i < 50; i++) {
Input input = new Input();
input.setNameInput("第" + i + "次请求");
inputList.add(input);
}
//开启多线程调用方法
List outputList = AsyncFunctionImpl.asyncFunction(inputList, (x) -> getName(x));
outputList.forEach(p-> System.out.println(p.getNameOutput()));
}
/**
* 请求实体类
*/
public static class Input {
private String nameInput;
public String getNameInput() {
return nameInput;
}
public void setNameInput(String nameInput) {
this.nameInput = nameInput;
}
}
/**
* 返回实体类
*/
public static class Output {
private String nameOutput;
public String getNameOutput() {
return nameOutput;
}
public void setNameOutput(String nameOutput) {
this.nameOutput = nameOutput;
}
}
/**
* 你的业务逻辑方法
*
* @param input 请求实体类参数
* @return 返回实体类参数
*/
public static Output getName(Input input) {
//为了证明我们的确开启了多线程,所以此处加了沉睡1秒钟的操作,50次循环在5秒钟内执行完毕,证明的确开启了多线程
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Output output = new Output();
//方法执行逻辑,我们这里只是将请求参数的nameInput赋值给返回参数的nameOutput
output.setNameOutput(input.getNameInput()+",返回结果赋值");
//返回
return output;
}
java 线程 主进程_java 多线程通用方法相关推荐
- java线程怎么用_Java多线程基本使用
一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...
- java 线程 异常中断_java多线程并发之旅-19-InterruptedException 中断异常处理及中断机制...
引言 如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此. 中断机制是如何工作的?捕获或检测到中断后,是抛出 InterruptedException 还 ...
- java 线程面试题_JAVA多线程面试题(一)
1.进程和线程的区别 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进 ...
- java线程代码实现_Java 多线程代码实现讲解
作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...
- java线程集合点_Java多线程学习笔记(三) 甚欢篇
使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...
- java 线程的理解_Java多线程基础理解
wait: 让当前线程处于"等待(阻塞)状态","直到其他线程调用此对象的notify()方法或是notifyAll()方法",当前线程被唤醒(进入" ...
- java线程异步传值_Java 多线程传值的四种方法
Java 多线程传值的四种方法 作者: sunjs 更新时间:2020-09-11 15:20:16 原文链接 其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数 ...
- java线程饥饿原理_java 多线程饥饿现象的问题解决方法
java 多线程饥饿现象的问题解决方法 当有线程正在读的时候,不允许写 线程写,但是允许其他的读线程进行读.有写线程正在写的时候,其他的线程不应该读写.为了防止写线程出现饥饿现象,当线程正在读,如果写 ...
- java线程知识梳理_Java多线程——多线程相关知识的逻辑关系梳理
1 学习多线程知识的根本目标 多线程知识的根本目标是:设计稳健的并发程序. 当然,本文无法回答这个实践性很强的问题(这与具体的业务相关,涉及到具体的策略),本文主要阐述相关知识之间的关系,希望初学者不 ...
最新文章
- iOS开发之性能优化
- 数据中心节水管理办法(范例)
- 全球及中国汽车流通行业营销模式及十四五竞争格局展望报告2021-2027年
- 读《不要告诉我你懂margin(海玉的博客)》有感
- 中专选计算机应用很难,对中专计算机应用基础改革的思考.pdf
- Debian Security Advisory(Debian安全报告) DSA-4411-1 firefox-esr security update
- 纯CSS3美化单选按钮radio
- python中的文件备份过程
- python html转换为普通文本_将HTML表转换为可读的纯文本的Python解决方案
- 全数字实时仿真平台SkyEye与SystemC集成进行时序仿真
- 重塑自己的语音 笔记1
- python webservices_python实现webservices接口并调用
- MAC下安装配置Tomcat
- 微信小程序搭载node.js服务器(简)
- 使用HTML制作网页
- 织梦首页php打开慢,DEDECMS网站打开速度慢解决方法
- 剑网三客户端修复连接服务器失败,剑网3客户端异常 无法打开处理解决办法
- CORBA、ACE、TAO之间的关系
- codeup墓地目录(算法笔记习题刷题笔记)
- LBP算法的研究及其实现
热门文章
- 【Java】java JMX之ObjectName
- 【JVM】JVM 调优之 -XX 参数
- 95-180-045-源码-Watermark-递增时间戳分配器(AscendingTimestampExtractor)
- Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支
- mac 系统下 autoconf 安装
- php5.2 $_GET漏洞,ThinkPHP5 远程代码执行漏洞-动态分析
- 太肝了、最近5年183个Java面试问题列表及回答(值得收藏)
- 据说,80%的人没有真正理解了Spring的依赖注入
- MySQL中视图和触发器学习
- springboot 插入返回id_Spring Boot实现分布式微服务开发实战系列(七)