springboot使用自定义的线程池 完成 多线程执行网络请求,返回数据后,统一返回给前段

devtools/2024/12/27 19:46:37/

定义自定义线程池配置类

  • 创建一个ThreadPoolConfig类,用于配置自定义线程池的参数。
java">import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
@Configuration
public class ThreadPoolConfig {@Beanpublic ExecutorService customThreadPool() {// 核心线程数为5int corePoolSize = 5;// 最大线程数为10int maximumPoolSize = 10;// 线程空闲存活时间为60秒long keepAliveTime = 60;// 时间单位为秒TimeUnit unit = TimeUnit.SECONDS;// 使用有界阻塞队列,容量为100LinkedBlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);}
}
  • 这个配置类使用@Configuration注解标记,表明它是一个配置类。@Bean注解用于定义一个由 Spring 管理的ExecutorService类型的 Bean,也就是自定义的线程池。这里创建了一个ThreadPoolExecutor对象,设置了核心线程数、最大线程数、线程空闲存活时间、队列容量等参数。

创建网络请求服务类

  • 定义一个NetworkRequestService类,用于执行网络请求。自己找工具类

 

java">import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class NetworkRequestService {private final RestTemplate restTemplate = new RestTemplate();public String makeNetworkRequest(String url) {ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);return response.getBody();}
}

 

编写控制器类来处理多线程网络请求并返回结果给前端

  • 创建一个MultiThreadRequestController类。
java">import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
@RestController
public class MultiThreadRequestController {@Autowiredprivate NetworkRequestService networkRequestService;@Autowiredprivate ExecutorService customThreadPool;@GetMapping("/multi-request")public List<String> multiThreadRequests() throws InterruptedException, ExecutionException {// 定义要请求的URL列表List<String> urls = List.of("https://example1.com", "https://example2.com", "https://example3.com");List<Future<String>> futures = new ArrayList<>();for (String url : urls) {// 提交任务到自定义线程池Future<String> future = customThreadPool.submit(() -> networkRequestService.makeNetworkRequest(url));futures.add(future);}List<String> results = new ArrayList<>();for (Future<String> future : futures) {// 获取每个任务的结果results.add(future.get());}return results;}
}

 

  • 这个类是一个 Spring REST 控制器,使用@RestController注解标记。它通过@Autowired注入了NetworkRequestService和自定义的ExecutorServicemultiThreadRequests方法是一个处理 HTTP GET 请求的端点。它首先定义了一个要请求的URL列表,然后循环将每个网络请求任务提交到自定义线程池,将返回的Future对象保存到futures列表中。接着,它遍历futures列表,通过future.get()方法获取每个任务的结果,将结果保存到results列表中,最后返回results列表给前端。

 


http://www.ppmy.cn/devtools/145902.html

相关文章

如何在openwrt中使用docker(命令行版)

1. 前提条件 在 OpenWRT 上运行 Docker&#xff0c;您需要确保以下条件满足&#xff1a; 支持 Docker 的设备&#xff1a;您的路由器或设备需要有足够的存储空间&#xff08;建议至少 16GB&#xff09;和 RAM&#xff08;建议至少 512MB&#xff09;。已安装 OpenWRT&#xf…

面试场景题系列:设计限流器

首先看看使用API限流器的好处。 •预防由拒绝服务攻击(Denial of Service&#xff0c;DoS)引起的资源耗尽问题。大型科技公司发布的所有API几乎都强制执行某种形式的限流操作。例如&#xff0c;推特限制每个用户每3小时最多发300条推文。谷歌文档API的默认限制是每个用户每60秒…

突发!!!GitLab停止为中国大陆、港澳地区提供服务,60天内需迁移账号否则将被删除

GitLab停止为中国大陆、香港和澳门地区提供服务&#xff0c;要求用户在60天内迁移账号&#xff0c;否则将被删除。这一事件即将引起广泛的关注和讨论。以下是对该事件的扩展信息&#xff1a; 1. 背景介绍&#xff1a;GitLab是一家全球知名的软件开发平台&#xff0c;提供代码托…

Docker 安装mysql ,redis,nacos

一、Mysql 一、Docker安装Mysql 1、启动Docker 启动&#xff1a;sudo systemctl start dockerservice docker start 停止&#xff1a;systemctl stop docker 重启&#xff1a;systemctl restart docker 2、查询mysql docker search mysql 3、安装mysql 3.1.默认拉取最新版…

微信小程序项目开发【从0到1~入门篇】

创建第一个小程序 1、小程序简介2、第一个小程序&#xff1a;注册小程序开发账号3、第一个小程序&#xff1a;安装开发者工具3.1 了解微信开发者工具3.2下载安装3.3 扫描登录 4、创建小程序项目5、小程序代码的构成5.1json配置文件5.2WXML模板5.3WXSS样式5.4JS 逻辑交互 6、宿主…

【Leetcode 热题 100】208. 实现 Trie (前缀树)

问题背景 T r i e Trie Trie 或者说 前缀树 是一种树形数据结构&#xff0c;用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景&#xff0c;例如自动补全和拼写检查。 请你实现 Trie 类&#xff1a; Trie() 初始化前缀树对象。void insert(String word…

微信小程序给外面的view设置display:flex;后为什么无法给里面的view设置宽度

如果父盒子view设置了display:flex&#xff0c;子view设置宽度值无效&#xff0c;宽度值都是随着内容多少而改变&#xff1a; 问题视图&#xff1a; 原因&#xff1a; flex布局元素的子元素&#xff0c;自动获得了flex-shrink的属性 解决方法&#xff1a; 给子view增加:fl…

RK3588在Android13/14如何查看GPU,NPU,DDR,RGA数据

由于Android13上selinux的权限管控加强&#xff0c;原来android12的方法已经无法获取到性能相关数据了&#xff0c;故单独介绍Android13上的性能数据获取 首先需要保障能过获取到root权限&#xff0c;adb root能够生效&#xff0c;adb shell进入shell命令行 mount -t debugfs…