spring 线程池和java线程池

作者: 会飞的蜗牛F | 来源:发表于2020-10-12 14:06 被阅读0次

jdk线程池就是使用jdk线程工具类ThreadPoolExecutor 创建线程池
spring线程池就是使用自己配置的线程池,然后交给spring处理,可以采用Async,也可以引入线程池的bean依赖。
记一下线程池优化不当导致的资源耗尽

原本接口业务逻辑

       ExecutorService executorService = Executors.newFixedThreadPool(10);
        CountDownLatch countDownLatch = new CountDownLatch(subjectList.size());
        try {
            for (Subject subject : subjectList) {
                Member finalMember = member;
                executorService.execute(() -> {
                    //耗时操作...
                    content.add(subjectMap);
                    countDownLatch.countDown();
                });
            }
            countDownLatch.await();
            
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            executorService.shutdown();
        }

由于该接口访问频率很频繁,每次访问会创建新的线程池,另外接口的循环内部不断创建线程处理,导致访问次数多了系统内部资源耗尽。

解决优化:

1、配置线程池,这样不用每次创建新的线程池

@Configuration
@EnableAsync
public class TaskExecutorConfig {

    @Bean("taskExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(10);
        // 设置最大线程数
        executor.setMaxPoolSize(30);
        // 设置队列容量
        executor.setQueueCapacity(Integer.MAX_VALUE);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("member-");
        // 设置拒绝策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        return executor;
    }
}

2、接口内部逻辑不变,也是循环创建线程处理,但是此时线程池处理不过来可以放入队列中缓冲
处理,这样不用无限创建线程,避免了内存耗尽,但是效率明显不如上面的。

 @Autowired
    private TaskExecutor taskExecutor;

List<Map<String, Object>> content = Lists.newArrayList();
        CountDownLatch countDownLatch = new CountDownLatch(subjectList.size());
        for (Subject subject : subjectList) {
            Member finalMember = member;
            taskExecutor.execute(() -> {
                this.asyncSubject(subject, finalMember, loginName, content, countDownLatch);
            });
        }

相关文章

网友评论

    本文标题:spring 线程池和java线程池

    本文链接:https://www.haomeiwen.com/subject/yongdktx.html