springBoot配置多个线程池

因为业务需要,出现了异步方法调用异步方法的现象,而且两个异步方法都使用了同一个异步线程池。但是这种会有一定的问题,下边先分析一下:

异步线程A调用了异步线程X。执行A的时候从线程池拿了一个线程,结果执行到X的时候线程池满了,加入了等待队列,但是此时线程池的线程A在等待X的执行结果,没有返回就不会释放,进入了死锁。。
但是如果你配置了超时释放时间,或者等待队列无限大,或者拒绝策略是直接丢弃,其实是不会出现这种情况的,但是合理的异步使用方法是需要做到线程池隔离的,所以我就把原来单一的线程池配置变成了多个线程池配置。
这是单个的配置:

@Configuration
public class AsyncConfig extends AsyncConfigurerSupport {
    @Bean("asyncExecutor")
    public ThreadPoolTaskExecutor asyncExecutor() {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        threadPool.setCorePoolSize(30);
        threadPool.setMaxPoolSize(200);
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        threadPool.setAwaitTerminationSeconds(60 * 15);
        threadPool.setThreadFactory(
            new ThreadFactoryBuilder().setNameFormat("async-thread-pool-%d").build());
        return threadPool;
    }
    @Override
    public Executor getAsyncExecutor() {
        return asyncExecutor();
    }
}

这是多个的配置

@Configuration
@EnableAsync
public class AsyncConfig{

    private ThreadPoolTaskExecutor asyncExecutor(String prefix) {
        ThreadPoolTaskExecutor threadPool = new ThreadPoolTaskExecutor();
        threadPool.setCorePoolSize(30);
        threadPool.setMaxPoolSize(200);
        threadPool.setWaitForTasksToCompleteOnShutdown(true);
        threadPool.setAwaitTerminationSeconds(60 * 15);
        threadPool.setThreadFactory(
                new ThreadFactoryBuilder().setNameFormat("async-thread-pool-"+ prefix +"-%d").build());
        return threadPool;
    }

    @Bean("asyncExecutor")
    public AsyncTaskExecutor getFirstAsync(){
        return asyncExecutor("first");
    }

    @Bean("secondExecutor")
    public AsyncTaskExecutor getSecondAsync(){
        return asyncExecutor("second");
    }
}

下边进行具体的测试:

@Service
@Slf4j
public class TestService {
    @Async("asyncExecutor")
    public Future<String> testF(String first){
        String flag = "7777777" + " is: " + first;
        System.out.println(flag);
        System.out.println(Thread.currentThread().getName());
        return new AsyncResult(flag);
    }

    @Async("secondExecutor")
    public Future<String> testS(String first){
        String flag = "6666666" + " is: " + first;
        System.out.println(flag);
        System.out.println(Thread.currentThread().getName());
        return new AsyncResult(flag);
    }
}

测试代码如下:

@Resource
    private TestService testService;
    @Test
    public void asyncTest(){
        Future<String> ff = testService.testF("first");
        Future<String> ss = testService.testS("second");
        String f = "";
        String s = "";
        try{
            f = ff.get();
            s = ss.get();
        } catch (Exception e){
            System.out.println("e occur.");
        }
        System.out.println("done");
        System.out.println(f);
        System.out.println(s);
    }

调用结果如下:

在这里插入图片描述
可以清楚地看到,两个异步使用了不同的线程池~

问题解决

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,我们可以使用自定义线程池来实现多个线程池的功能。首先,我们可以通过两种方法来自定义线程池。 第一种方法是创建一个自定义的线程池,可以指定线程池的名称,并执行异步任务。需要在配置文件中进行线程池的相关参数配置,如核心线程数、最大线程数、空闲线程存活时间、队列容量等。同时,还可以设置线程名称前缀和线程池等待终止时间。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot 自定义线程池](https://blog.csdn.net/weixin_40816738/article/details/123974806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [spring boot注解事务+多线程](https://download.csdn.net/download/qq_35086941/10937947)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [springboot配置多个线程池](https://blog.csdn.net/IT_road_qxc/article/details/123090678)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值