当前位置: 首页 > article >正文

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

定义自定义线程池配置类

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

创建网络请求服务类

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

 

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类。
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 {
    @Autowired
    private NetworkRequestService networkRequestService;
    @Autowired
    private 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.kler.cn/a/454329.html

相关文章:

  • “游戏信息化”:游戏后台系统的未来发展
  • uniapp使用live-pusher实现模拟人脸识别效果
  • MongoDB 创建用户、User、Role 相关 操作
  • Linux:code:network:devinet_sysctl_forward;IN_DEV_FORWARD
  • Java抽象工厂+单例模式
  • SpringAI人工智能开发框架006---SpringAI多模态接口_编程测试springai多模态接口支持
  • 计算机网络基础知识
  • vulnhub-matrix-breakout-2-morpheus
  • Rust : tokio中select!
  • 聊一聊 C#线程池 的线程动态注入
  • Flutter persistentFooterButtons控件详解
  • 【EI会议征稿】人工智能与遥感应用国际会议 (AIRSA 2025)
  • uniapp popup弹窗组件的自定义使用方法
  • Large Language Model based Multi-Agents: A Survey of Progress and Challenges
  • (补)算法刷题Day24: BM61 矩阵最长递增路径
  • 本地部署 LLaMA-Factory
  • 解决:excel鼠标滚动幅度太大如何调节?
  • (NIPS-2024)PISSA:大型语言模型的主奇异值和奇异向量适配
  • 社区二手物品交易小程序ssm+论文源码调试讲解
  • 如何通过HTTP API插入或更新Doc
  • Android Framework 目录下的 AV/Camera 定制常见问题及解决方法
  • Coding(Jenkinsfile)+ Docker 自动化部署 Springboot —— 图文细节和一些注意事项说明
  • 【NIFI】实现ORACLE->ORACLE数据同步
  • Springboot 整合 Duird
  • 【计算机网络安全】加密解密及其在ssh上的应用
  • 面试场景题系列:设计支付系统