定义自定义线程池配置类
- 创建一个
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 {@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
类,用于执行网络请求。自己找工具类
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 {@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
和自定义的ExecutorService
。multiThreadRequests
方法是一个处理 HTTP GET 请求的端点。它首先定义了一个要请求的URL
列表,然后循环将每个网络请求任务提交到自定义线程池,将返回的Future
对象保存到futures
列表中。接着,它遍历futures
列表,通过future.get()
方法获取每个任务的结果,将结果保存到results
列表中,最后返回results
列表给前端。