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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • VS2010安装失败

    我的情况和http://blog.csdn.net/gtatcs/article/details/8770025类似:安装提示错误:然后 尝试单独安装.net4.0.NETFramework4.0安装失败原因是HRESULT0xc8000222,截图如下:搜索“.netframework4.00xc8000222”的解决办

    2022年4月7日
  • 数据泄露大多是破坏保密性或可用性 那破坏完整性是怎样的 又该如何应对

    数据泄露大多是破坏保密性或可用性 那破坏完整性是怎样的 又该如何应对

    2022年3月6日
  • UML类图介绍

    UML类图介绍文章目录UML类图一、类图概述二、类图的作用三、类图表示法1.类的表示方式2.类与类之间关系的表示方式2.1关联关系2.2聚合关系2.3组合关系2.4依赖关系2.5继承关系2.6实现关系UML类图一、类图概述类图显示了模型中存在的类、类的内部结构以及它们与其他类的关系二、类图的作用类图描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解三、类图表示法1.类的表示方式在UML类图中,类使用包含类名、属性和方法且带有分割线的矩形来表示比如下图表示一个Emp

    2022年7月14日
  • idea快捷键整理代码_idea中快捷键

    idea快捷键整理代码_idea中快捷键IDEA常用快捷键

    2022年10月12日
  • 磁盘显示没有初始化找到数据法子[通俗易懂]

    磁盘显示没有初始化找到数据法子[通俗易懂]没有初始化是因为分区表损坏了,导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子没有初始化是因为分区表损坏了,导致移动硬盘出现没有初始化。磁盘显示没有初始化找到数据法子工具/软件:光明数据恢复软件步骤1:程序打开后,直接双击需要恢复的物理盘,没有初始化需要从磁盘恢复文件。步骤2:坐等软件扫描完成一般需要几分钟到半个小时,稍微耐心等下即可。步骤3:打钩所有需要恢复的文件,然后点右上角的保存,《另存为》按钮,将打钩的文件拷贝出来。步骤4:最后一步只需要等程序将文件复制完成就可以了

    2022年9月21日
  • 使用批处理命令向win server AD域中批量添加用户实现

    使用批处理命令向win server AD域中批量添加用户实现因为要用个批处理命令在WindowsServer里面批量添加域用户,所以需要使用批处理命令。我这篇是纯新手教程,在百度上搜了一些批处理命令感觉属于进阶教程,研究了两天才完成我要完成的目标。下面从头说一下:批处理bat文档建立。直接新建一个TXT文档然后把后缀名改成.bat就可以了,就是一个bat文档,双击可以运行。注意:bat文件在哪,他的运行路径就在哪。添加成功的用户

    2022年5月13日

发表回复

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

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