栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot使用线程池(ThreadPoolTaskExecutor)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot使用线程池(ThreadPoolTaskExecutor)

代码仓库:gitee

线程池创建
@Configuration
@EnableAsync
public class TaskPoolConfig {

    @Bean("syncExecutorPool")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        // 核心池大小
        taskExecutor.setCorePoolSize(5);
        // 最大线程数
        taskExecutor.setMaxPoolSize(10);
        // 队列程度
        taskExecutor.setQueueCapacity(100);
        // 线程空闲时间
        taskExecutor.setKeepAliveSeconds(60);
        // 线程前缀名称
        taskExecutor.setThreadNamePrefix("syncExecutor--");
        // 该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,
        // 这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。
        taskExecutor.setWaitForTasksToCompleteonShutdown(true);
        // 任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住。
        taskExecutor.setAwaitTerminationSeconds(300);
        // 线程不够用时由调用的线程处理该任务
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return taskExecutor;
    }
}
线程池参数

核心线程数量:CorePoolSize

        看业务场景设置(我通常设置为CPU核心*1)

最大线程数量:MaxPoolSize

        当核心线程数量都在使用状态时,会调用最大线程数量里的线程,使用的总线程不会超过最大线程数量,其余则等待(我通常设置为CPU核心*2)

队列程度:QueueCapacity

        线程队列的大小

线程空闲时间:KeepAliveSeconds

线程前缀名称:ThreadNamePrefix

停机策略:WaitForTasksToCompleteOnShutdown

        该方法用来设置 线程池关闭 的时候 等待 所有任务都完成后,再继续 销毁 其他的 Bean,这样这些 异步任务 的 销毁 就会先于 数据库连接池对象 的销毁。

任务的等待时间:AwaitTerminationSeconds

        任务的等待时间 如果超过这个时间还没有销毁就 强制销毁,以确保应用最后能够被关闭,而不是阻塞住

拒接策略:RejectedExecutionHandler

        线程不够用时由调用的线程处理该任务

线程池测试1(核心线程数量)

        结果:线程池的核心线程数量轮训执行 

线程池测试2(当核心线程数量和最大线程数量不够时)

        随机睡眠0-10000毫秒

        new Random().nextInt(10000)

 @Async("syncExecutorPool")
    public void syncTest() {
        try {
            int i = new Random().nextInt(10000);
            log.info("syncServiceImpl.syncTest.随机睡眠:{}毫秒", i);
            Thread.sleep(i);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


        结果:

                        当5个核心线程数量不够用时,使用最大线程数量里的线程

                        当最大线程数量不够用时,使用主线程执行该任务

// 线程不够用时由调用的线程处理该任务
taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());

        

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/677568.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号