使用线程池 Future超时解决集合子线程性能差问题

优化多线程性能
synListItem = Collections.synchronizedList(new ArrayList <  > ());
Iterator < Map < String, Object >> iterator = listItem.iterator();
while (iterator.hasNext()) {
    try {
        final Future <  ?  > future = ExecutorFactory.getEs().submit(()->{
            Map < String,Object > map = iterator.next();
            // 逻辑处理
            synListItem.xxx
        });
        try {
            future.get(threadTimeout, TimeUnit.SECONDS);
        } catch (TimeoutException e) {
            future.cancel(true);
            log.error("timeout.....");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}


基于上篇文章使用程序计数器去承接多个子线程解决性能差的远程网络I/O问题,但是发现会出现集合多线程情况下的未知情况:因为程序计数器只是对线程进行阻塞,当程序计数器减为0 或者 时间到时,子线程依旧在执行和主线程异步执行,如果子线程被修改的集合被下面执行的主线程调用,则会出现多线程问题

基于这个问题使用很多的解决方案,

  1. 使用List 遍历 future.get()
  2. 使用 CompletableFuture allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
    但是发现性能都欠佳

最后压测和实验发现,一个线程处理其自己的线程性能最好,同时,异步等待超时,中断线程。
只能展示部分压测效果:
在这里插入图片描述

在这里插入图片描述

<think>我们正在讨论SpringMVC线程池配置与性能优化。根据引用内容,我们可以从以下几个方面进行优化:1.**异步处理**:使用Spring MVC的异步处理功能(如@Async注解)来释放请求处理线程,提高并发能力。2.**配置全局异步线程池**:通过实现`WebMvcConfigurer`接口并重写`configureAsyncSupport`方法,可以设置自定义线程池超时时间。3.**减少锁竞争**:避免在多线程环境下对共享资源的竞争,如全局变量、静态缓存等。在分布式场景下,注意数据库和Redis的共享数据操作。 4. **合理使用依赖注入**:根据引用[4],合理选择注入方式(构造器注入、Setter注入等)以避免空指针等问题。具体实施步骤:###1.配置全局异步线程池在Spring MVC中,我们可以通过配置类来设置异步处理的线程池。以下是一个配置示例:```java@Configurationpublic classWebConfigimplements WebMvcConfigurer{@Overridepublic voidconfigureAsyncSupport(AsyncSupportConfigurerconfigurer) {ThreadPoolTaskExecutor executor= newThreadPoolTaskExecutor();executor.setCorePoolSize(20);//核心线程数executor.setMaxPoolSize(100);//最大线程数executor.setQueueCapacity(500);//队列容量executor.setThreadNamePrefix("mvc-async-");//线程名前缀executor.initialize();configurer.setTaskExecutor(executor);//设置自定义线程池configurer.setDefaultTimeout(10000); //设置全局超时时间(毫秒)}} ```###2.在Controller中使用异步处理在Controller方法上使用`@Async`注解,使方法在异步线程中执行。注意:需要开启异步支持(在配置类上添加`@EnableAsync`)。```java@RestControllerpublic classMyController{@GetMapping("/async")@Asyncpublic CompletableFuture<String>asyncMethod() {//模拟耗时操作try {Thread.sleep(1000);} catch(InterruptedException e) {e.printStackTrace();}returnCompletableFuture.completedFuture("异步处理完成");}} ```###3.优化锁竞争-避免在Controller或Service中定义可变的静态变量。-如果必须使用共享资源,考虑使用线程安全的合(如`ConcurrentHashMap`)或使用锁机制(如`ReentrantLock`)来控制并发访问。 -在分布式环境下,使用分布式锁(如RedisRedisson)来保证数据一致性。###4.依赖注入优化-推荐使用构造器注入,因为它在对象创建时就注入依赖,避免空指针,并且便于测试。-避免使用字段注入(Field Injection),因为它可能导致空指针异常且不易测试。 ```java@Servicepublic classMyService{private finalAnotherServiceanotherService;//构造器注入publicMyService(AnotherService anotherService){this.anotherService= anotherService;}} ```###性能优化总结通过以上方法,我们可以显著提升SpringMVC应用的并发处理能力。异步处理将耗时操作放入线程池,避免阻塞请求线程;合理配置线程池参数可以充分利用系统资源;减少锁竞争可以避免线程阻塞;依赖注入优化则能提高代码的健壮性和可测试性。§§相关问题§§1. SpringMVC中如何监控线程池的运行状态?2.除了线程池,还有哪些Spring MVC性能优化方法?3.异步处理中如何优雅地处理超时?</think>### Spring MVC线程池配置与性能优化方案 #### 1. 全局异步线程池配置(核心方案) 通过实现`WebMvcConfigurer`接口配置全局线程池: ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureAsyncSupport(AsyncSupportConfigurer configurer) { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(20); // 核心线程数(根据CPU核数调整) executor.setMaxPoolSize(100); // 最大线程数(突发流量处理) executor.setQueueCapacity(500); // 任务队列容量(防溢出) executor.setThreadNamePrefix("mvc-async-"); executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略 executor.initialize(); configurer.setTaskExecutor(executor); // 绑定线程池 configurer.setDefaultTimeout(30_000); // 超时时间(ms) } } ``` > **关键参数说明**: > - `corePoolSize`:常驻线程数,建议设为CPU核心数×2 > - `queueCapacity`:缓冲队列大小,防止线程瞬增 > - 拒绝策略:`CallerRunsPolicy`保证任务不丢失[^3] #### 2. Controller层异步处理 使用`Callable`或`DeferredResult`实现非阻塞: ```java @GetMapping("/async-data") public Callable<ResponseEntity> fetchData() { return () -> { // 耗时操作在子线程执行 Data data = heavyQueryService.execute(); return ResponseEntity.ok(data); }; } ``` > **优势**:释放Tomcat工作线程,提高并发吞吐量[^2] #### 3. Service层线程池优化 配置业务线程池(与MVC线程池隔离): ```yaml # application.yml spring: task: execution: pool: core-size: 10 max-size: 50 queue-capacity: 200 thread-name-prefix: biz-thread- ``` 使用`@Async`注解实现异步服务: ```java @Service public class ReportService { @Async // 使用独立线程池执行 public CompletableFuture<Report> generateReport() { // 报表生成逻辑 } } ``` #### 4. 性能优化关键点 1. **避免锁竞争**: - 减少`synchronized`使用,改用`ConcurrentHashMap`等并发容器 - 分布式场景用Redis分布式锁替代JVM锁[^3] 2. **连接池优化**: ```yaml spring: datasource: hikari: maximum-pool-size: 20 # 匹配线程池大小 connection-timeout: 3000 ``` 3. **监控与调优**: - 使用`/actuator/metrics`监控线程池状态 - 关键指标:`queue_size`(队列堆积)、`active_threads`(活跃线程) #### 5. 与Spring MVC协同优化 | 优化方向 | MVC线程池 | 业务线程池 | |-------------------|-------------------------------|--------------------------| | **职责** | 处理HTTP请求 | 执行业务逻辑 | | **隔离性** | 避免Web请求阻塞 | 防止业务异常影响Web层 | | **配置建议** | 核心线程数=CPU核数×2 | 按业务类型动态调整 | | **超时控制** | 通过`setDefaultTimeout()`设置 | 用`@Async`+`Future`超时 | > **最佳实践**:简单场景优先用Spring MVC同步处理,高并发或IO密型操作使用异步方案[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT_Octopus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值