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


相关推荐

  • 数据的本质是什么?数据的表现形式有哪些?_大数据本质是什么答案

    数据的本质是什么?数据的表现形式有哪些?_大数据本质是什么答案2010年,“数据科学家”这个称谓的发明者帕蒂尔(DJPatil)和杰夫·哈默巴赫(JeffHammerbacher)认为,一切应该以产品为中心,从数据获取、数据清洗、搭建和管理数据设施、原型开发、产品设计等方面,去实践数据的价值。一、一场以大数据为核心的智能盛宴时下仿佛大家都在谈人工智能,就像当年人人都在谈大数据一样。在不同场合上,阿里巴巴的马云、百度的李彦宏及腾讯的马化腾分别谈过自己…

    2022年10月5日
    0
  • JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件

    JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件javaCV系列文章:javacv开发详解之1:调用本机摄像头视频javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)javaCV开发详解之4:转流器实现(也可作…

    2022年5月8日
    132
  • 如何学习Python的一些总结

    如何学习Python的一些总结

    2021年10月23日
    42
  • gridbagconstraints什么意思_java rectangle

    gridbagconstraints什么意思_java rectangle说明:GridBagLayout只有一个无参的构造器,要使用它就必须用setConstraints(Componentcomp,GridBagConstraintsconstraints)将它和GridBagConstraints关联起来!当GridBagLayout与无参的GridBagConstraints关联时,此时它就相当于一个GridLayout,只不过,用GridLayout布局的

    2022年9月9日
    0
  • Set集合详解

    Set集合详解定义:一个set集合不能包含重复的元素,set实现Collection并增加了hashCode和equals方法。set不允许存储值相同的元素,原因为在取值的时候set依靠的是元素本身取值。由于set提供了hashCode和Equals方法,所以set支持比较。set主要实现HashSet,TreeSet,LinkedHashSet(后面会分别以不同的文章介绍着三种实现)set允许存储一个null…

    2022年6月3日
    141
  • BP简单的理解神经网络

    BP简单的理解神经网络

    2022年1月9日
    52

发表回复

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

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