SpringBoot线程池使用

SpringBoot线程池使用一、线程池管理配置类@Configuration@EnableAsyncpublicclassExecutorConfig{privatestaticfinalLoggerlogger=LoggerFactory.getLogger(ExecutorConfig.class);@BeanpublicExecutorasyncTaskS…

大家好,又见面了,我是你们的朋友全栈君。

一、线程池管理配置类

@Configuration
@EnableAsync
public class ExecutorConfig {
    private static final Logger logger = LoggerFactory.getLogger(ExecutorConfig.class);

    @Bean
    public Executor asyncTaskServiceExecutor () {
        logger.info("init asyncTaskServiceExecutor begin...");
        /* 线程池执行管理容器 */
        ThreadPoolTaskExecutor executor = new VisiableThreadPoolTaskExecutor();
         //配置核心线程数
        executor.setCorePoolSize(50);
        //配置最大线程数
        executor.setMaxPoolSize(300);
        //配置队列大小
        executor.setQueueCapacity(1000);
        //配置线程池中的线程的名称前缀
        executor.setThreadNamePrefix("async-service-");
        // rejection-policy:当pool已经达到max size的时候,并且队列已经满了,如何处理新任务
        // CallerRunsPolicy:不在新线程中执行任务,而是有调用者所在的线程来执行
        //DiscardPolicy: 直接丢弃
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //执行初始化
        executor.initialize();
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        logger.info("init asyncTaskServiceExecutor end...");
        return executor;
    }
}

二、VisiableThreadPoolTaskExecutor类

public class VisiableThreadPoolTaskExecutor extends ThreadPoolTaskExecutor {
    private static final Logger logger = LoggerFactory.getLogger(VisiableThreadPoolTaskExecutor.class);

    private void printCurrentThreadPoolInfo () {
        ThreadPoolExecutor threadPoolExecutor = getThreadPoolExecutor();
        if (null == threadPoolExecutor) {
            logger.info("当前异步线程池未完成初始化...");
            return;
        }
        logger.info("当前线程池情况:名称前缀-{},任务总数-[{}],已完成的任务总数-[{}],可调度执行的工作线程总数-[{}],任务队列大小-[{}]",
                this.getThreadNamePrefix(),
                threadPoolExecutor.getTaskCount(),
                threadPoolExecutor.getCompletedTaskCount(),
                threadPoolExecutor.getActiveCount(),
                threadPoolExecutor.getQueue().size()
        );
    }

    @Override
    public void execute(Runnable task) {
        printCurrentThreadPoolInfo();
        super.execute(task);
    }

    @Override
    public void execute(Runnable task, long startTimeout) {
        printCurrentThreadPoolInfo();
        super.execute(task, startTimeout);
    }

    @Override
    public Future<?> submit(Runnable task) {
        printCurrentThreadPoolInfo();
        return super.submit(task);
    }

    @Override
    public <T> Future<T> submit(Callable<T> task) {
        printCurrentThreadPoolInfo();
        return super.submit(task);
    }

    @Override
    public ListenableFuture<?> submitListenable(Runnable task) {
        printCurrentThreadPoolInfo();
        return super.submitListenable(task);
    }

    @Override
    public <T> ListenableFuture<T> submitListenable(Callable<T> task) {
        printCurrentThreadPoolInfo();
        return super.submitListenable(task);
    }

}

三、创建接口ThreadPoolAsyncTaskService

public interface ThreadPoolAsyncTaskService {
    //执行异步任务
    
    void executeAsync();
}

四、接口实现类

这里的 @Async(“asyncServiceExecutor”)中的名字asyncServiceExecutor为线程池配置管理中的方法名称;相当于是根据方法名称注入类;然后通过方法名称获取注入的类。

@Service
public class ThreadPoolAsyncTaskServiceImpl implements ThreadPoolAsyncTaskService {
    Logger logger = LoggerFactory.getLogger(ThreadPoolAsyncTaskServiceImpl.class);
   

    /**
     * 异步任务退费
     */
    @Override
    @Async("asyncTaskServiceExecutor")
    public void executeAsync() {
       //做业务逻辑处理即可
       logger.info("start executeAsync");
 
        try{
 
            Thread.sleep(1000);
 
        }catch(Exception e){
 
            e.printStackTrace();
 
        }
 
        logger.info("end executeAsync");

    }
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148714.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • navicat 激活码 2022【最新永久激活】

    (navicat 激活码 2022)好多小伙伴总是说激活码老是失效,太麻烦,关注/收藏全栈君太难教程,2021永久激活的方法等着你。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html1M2OME2TZY-eyJsaWNlbnNlSW…

    2022年4月2日
    4.1K
  • 信息审计服务器功能,服务器审计日志「建议收藏」

    信息审计服务器功能,服务器审计日志「建议收藏」服务器审计日志内容精选换一换Manager的审计日志默认保存在数据库中,如果长期保留可能引起数据目录的磁盘空间不足问题,管理员如果需要将审计日志保存到其他归档服务器,可以在FusionInsightManager设置转储参数及时自动转储,便于管理审计日志信息。若用户未配置审计日志转储,当审计日志达到十万条,系统自动将这十万条审计日志保存到文件中。保存路径为主管理节为加强对系统数据的容灾管理,云…

    2022年5月4日
    54
  • 后端框架有哪些?8个流行的后端框架推荐

    后端框架有哪些?8个流行的后端框架推荐后端框架有哪些?8个流行的后端框架推荐后端框架在选择要使用的后端框架时,有许多选项可用。虽然每个后端框架都有自己的优点和缺点,但在做出最终决定之前,还有一些其他因素需要考虑。在本指南中,我们将仔细研究经过尝试的框架,以确定哪个是最适合您的后端框架。后端vs前端如果您是Web开发世界的新手,后端和前端开发之间的区别可能不那么明显,但是,了解两者之间的区别很重要。以下是前端开发人员与后端开发人员的一些区别。前端开发:前端开发人员在很大程度上负责用户所看到的内容(即网站页面),前端开发人员主要使用HTM

    2022年6月10日
    548
  • Suse发生了错误Access denied for user &#39;&#39;@&#39;localhost&#39; to&amp;

    Suse发生了错误Access denied for user &#39;&#39;@&#39;localhost&#39; to&amp;

    2022年1月8日
    41
  • 10分钟了解JSON Web令牌(JWT)

    10分钟了解JSON Web令牌(JWT)

    2021年11月7日
    37
  • 伪代码的写法[通俗易懂]

    伪代码的写法[通俗易懂]伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。介于自然语言与编程语言之间。  它以编程语言的书写形式指明算法的职能。相比于程序语言(例如Java,C++,C,Dephi等等)它更类似自然语言。它是半角式化、不标准的语言

    2022年6月3日
    133

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号