第一次使用ThreadPoolTaskExecutor实现线程池的经历,反复修改了多次代码才正常使用

本文介绍了在使用ThreadPoolTaskExecutor进行消息推送时遇到的线程泄露问题及解决方案。从最初的每次推送创建新线程池,到尝试静态变量存储线程池但引发线程安全问题,再到使用synchronized关键字改进后的性能下降,最后通过双重检查锁定和volatile关键字解决了线程安全与初始化问题。

1、前言

  在一个向第三方平台推送消息的场景中,为了提高程序的执行效率,每次发送消息,都创建一个新的线程来完成发送消息的任务,为了提供线程的使用性能,我选择了ThreadPoolTaskExecutor线程池,结果在使用的过程中,出现了较多的问题,这里记录一下避免以后再出现类似的错误(这些错误是不应该出现的,还是对ThreadPoolTaskExecutor使用不熟悉造成的)。

2、ThreadPoolTaskExecutor用法简介

  ThreadPoolTaskExecutor是Spring Framework提供的一个线程池实现,它继承自ThreadPoolExecutor类,并实现了AsyncTaskExecutor和SchedulingTaskExecutor接口,可以用于异步任务执行和定时任务调度。
  我们通过配置类定义了一个ThreadPoolTaskExecutor的Bean,并设置了核心线程数、最大线程数、队列容量和线程名称前缀等参数。然后在MyService类中注入了这个线程池,并在executeTask方法中使用taskExecutor.execute()来提交一个异步任务。
  通过这种方式,我们可以方便地使用ThreadPoolTaskExecutor来执行异步任务,实现多线程处理和任务调度的功能。

  以下是ThreadPoolTaskExecutor的基本用法示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

@Configuration
public class ExecutorConfig {
   
   
    
    @Bean
    public ThreadPoolTaskExecutor taskExecutor() {
   
   
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(100);
        executor.setQueueCapacity(10);
        executor.setThreadNamePrefix("MyThread-");
        executor.initialize();
        return executor;
    }
}

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

@Component
public class MyService {
   
   

    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;

    public void executeTask() {
   
   
        taskExecutor.execute(() -> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

姠惢荇者

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

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

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

打赏作者

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

抵扣说明:

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

余额充值