写了一个多线程的通用调用方法,只需要传入请求参数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 多线程通用方法相关推荐

  1. java线程怎么用_Java多线程基本使用

    一.概念 1.进程 1.1进程:是一个正在进行中的程序,每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或者叫一个控制单元. 1.2线程:就是进程中一个独立的控制单元,线程在控制着进程的执行,一 ...

  2. java 线程 异常中断_java多线程并发之旅-19-InterruptedException 中断异常处理及中断机制...

    引言 如果对 Java 中断没有一个全面的了解,可能会误以为被中断的线程将立马退出运行,但事实并非如此. 中断机制是如何工作的?捕获或检测到中断后,是抛出 InterruptedException 还 ...

  3. java 线程面试题_JAVA多线程面试题(一)

    1.进程和线程的区别 一个进程是一个独立(self contained)的运行环境,它可以被看作一个程序或者一个应用.而线程是在进程中执行的一个任务.Java运行环境是一个包含了不同的类和程序的单一进 ...

  4. java线程代码实现_Java 多线程代码实现讲解

    作为一个完全面向对象的语言,Java提供了类 java.lang.Thread 来方便多线程编程,这个类提供了大量的方法来方便我们控制自己的各个线程.那么如何提供给 Java 我们要线程执行的代码呢? ...

  5. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  6. java 线程的理解_Java多线程基础理解

    wait: 让当前线程处于"等待(阻塞)状态","直到其他线程调用此对象的notify()方法或是notifyAll()方法",当前线程被唤醒(进入" ...

  7. java线程异步传值_Java 多线程传值的四种方法

    Java 多线程传值的四种方法 作者: sunjs 更新时间:2020-09-11 15:20:16 原文链接 其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数 ...

  8. java线程饥饿原理_java 多线程饥饿现象的问题解决方法

    java 多线程饥饿现象的问题解决方法 当有线程正在读的时候,不允许写 线程写,但是允许其他的读线程进行读.有写线程正在写的时候,其他的线程不应该读写.为了防止写线程出现饥饿现象,当线程正在读,如果写 ...

  9. java线程知识梳理_Java多线程——多线程相关知识的逻辑关系梳理

    1 学习多线程知识的根本目标 多线程知识的根本目标是:设计稳健的并发程序. 当然,本文无法回答这个实践性很强的问题(这与具体的业务相关,涉及到具体的策略),本文主要阐述相关知识之间的关系,希望初学者不 ...

最新文章

  1. iOS开发之性能优化
  2. 数据中心节水管理办法(范例)
  3. 全球及中国汽车流通行业营销模式及十四五竞争格局展望报告2021-2027年
  4. 读《不要告诉我你懂margin(海玉的博客)》有感
  5. 中专选计算机应用很难,对中专计算机应用基础改革的思考.pdf
  6. Debian Security Advisory(Debian安全报告) DSA-4411-1 firefox-esr security update
  7. 纯CSS3美化单选按钮radio
  8. python中的文件备份过程
  9. python html转换为普通文本_将HTML表转换为可读的纯文本的Python解决方案
  10. 全数字实时仿真平台SkyEye与SystemC集成进行时序仿真
  11. 重塑自己的语音 笔记1
  12. python webservices_python实现webservices接口并调用
  13. MAC下安装配置Tomcat
  14. 微信小程序搭载node.js服务器(简)
  15. 使用HTML制作网页
  16. 织梦首页php打开慢,DEDECMS网站打开速度慢解决方法
  17. 剑网三客户端修复连接服务器失败,剑网3客户端异常 无法打开处理解决办法
  18. CORBA、ACE、TAO之间的关系
  19. codeup墓地目录(算法笔记习题刷题笔记)
  20. LBP算法的研究及其实现

热门文章

  1. 【Java】java JMX之ObjectName
  2. 【JVM】JVM 调优之 -XX 参数
  3. 95-180-045-源码-Watermark-递增时间戳分配器(AscendingTimestampExtractor)
  4. Git仓库只拷贝代码-不拷贝提交记录-不拷贝其他分支
  5. mac 系统下 autoconf 安装
  6. php5.2 $_GET漏洞,ThinkPHP5 远程代码执行漏洞-动态分析
  7. 太肝了、最近5年183个Java面试问题列表及回答(值得收藏)
  8. 据说,80%的人没有真正理解了Spring的依赖注入
  9. MySQL中视图和触发器学习
  10. springboot 插入返回id_Spring Boot实现分布式微服务开发实战系列(七)