• springboot @async线程池使用以及oom问题


    springboot @async线程池使用以及oom问题

    声明线程池

    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

    import java.util.concurrent.ThreadPoolExecutor;


    @Configuration
    @EnableAsync
    public class ExecutorConfig1 {

        @Bean("taskExecutor")
        public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
            ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
            threadPoolTaskExecutor.setCorePoolSize(10);
            threadPoolTaskExecutor.setMaxPoolSize(10);
            threadPoolTaskExecutor.setQueueCapacity(20);
            threadPoolTaskExecutor.setKeepAliveSeconds(3000);
            threadPoolTaskExecutor.setThreadNamePrefix("Async-Service-");
            threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            return threadPoolTaskExecutor;
        }
    }

    业务逻辑类

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;

    import java.util.ArrayList;


    @Component
    public class QueryDataExec {

        @Autowired
        private TaskDataExec taskDataExec;

        public void execData() {
            ArrayList<String> list = new ArrayList<>();
            for (int i = 0; i < 10; i++) {
                taskDataExec.taskDataExec("id-" + i);
            }

        }
    }

    逻辑执行类,注意@Asycn 的处理类不能和调用一个类

    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.stereotype.Component;


    @Component
    public class TaskDataExec {
        Logger log = LoggerFactory.getLogger(TaskDataExec.class);

        @Async("taskExecutor")
        public void taskDataExec(String id) {
            log.info("开始处理:" + id);
            log.info("完成处理:" + id);
        }
    }

    测试类

    import org.junit.jupiter.api.Test;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;

    @SpringBootTest
    class UdpApplicationTests {

        @Test
        void contextLoads() {
            System.out.println("123");
        }

        @Autowired
        private QueryDataExec queryDataExec;

        @Test
        public void dataExecTest() {
            queryDataExec.execData();
        }
    }

    效果,注意Async-Service后面的数字是对应的线程池

    2021-04-13 16:17:19.290  INFO 7280 --- [Async-Service-1] com.udp.TaskDataExec                     : 开始处理:id-0
    2021-04-13 16:17:19.291  INFO 7280 --- [Async-Service-1] com.udp.TaskDataExec                     : 完成处理:id-0
    2021-04-13 16:17:19.292  INFO 7280 --- [Async-Service-3] com.udp.TaskDataExec                     : 开始处理:id-2
    2021-04-13 16:17:19.292  INFO 7280 --- [Async-Service-3] com.udp.TaskDataExec                     : 完成处理:id-2
    2021-04-13 16:17:19.303  INFO 7280 --- [Async-Service-2] com.udp.TaskDataExec                     : 开始处理:id-1
    2021-04-13 16:17:19.303  INFO 7280 --- [Async-Service-2] com.udp.TaskDataExec                     : 完成处理:id-1
    2021-04-13 16:17:19.304  INFO 7280 --- [Async-Service-4] com.udp.TaskDataExec                     : 开始处理:id-3
    2021-04-13 16:17:19.306  INFO 7280 --- [Async-Service-4] com.udp.TaskDataExec                     : 完成处理:id-3
    2021-04-13 16:17:19.309  INFO 7280 --- [Async-Service-5] com.udp.TaskDataExec                     : 开始处理:id-4
    2021-04-13 16:17:19.309  INFO 7280 --- [Async-Service-5] com.udp.TaskDataExec                     : 完成处理:id-4
    2021-04-13 16:17:19.312  INFO 7280 --- [Async-Service-6] com.udp.TaskDataExec                     : 开始处理:id-5
    2021-04-13 16:17:19.312  INFO 7280 --- [Async-Service-6] com.udp.TaskDataExec                     : 完成处理:id-5
    2021-04-13 16:17:19.315  INFO 7280 --- [Async-Service-7] com.udp.TaskDataExec                     : 开始处理:id-6
    2021-04-13 16:17:19.316  INFO 7280 --- [Async-Service-7] com.udp.TaskDataExec                     : 完成处理:id-6
    2021-04-13 16:17:19.316  INFO 7280 --- [sync-Service-10] com.udp.TaskDataExec                     : 开始处理:id-9
    2021-04-13 16:17:19.316  INFO 7280 --- [sync-Service-10] com.udp.TaskDataExec                     : 完成处理:id-9
    2021-04-13 16:17:19.316  INFO 7280 --- [Async-Service-8] com.udp.TaskDataExec                     : 开始处理:id-7
    2021-04-13 16:17:19.317  INFO 7280 --- [Async-Service-8] com.udp.TaskDataExec                     : 完成处理:id-7
    2021-04-13 16:17:19.318  INFO 7280 --- [Async-Service-9] com.udp.TaskDataExec                     : 开始处理:id-8
    2021-04-13 16:17:19.318  INFO 7280 --- [Async-Service-9] com.udp.TaskDataExec                     : 完成处理:id-8

    说一说@Async默认的效果每次调用都创建新的线程,具体可以看看这个文章
    https://blog.csdn.net/ignorewho/article/details/85603920

    不会,我可以学;落后,我可以追赶;跌倒,我可以站起来!
  • 相关阅读:
    C++基础--if/else和switch/case的区别
    条件概率,联合概率,边缘概率及独立事件,古典概型
    Maven中的Archetype概念及作用用途
    Unable to execute 'doFinal' with cipher instance
    查看是否存在tomcat进程和关闭方法
    python中的‘’的作用
    sklearn中predict_proba()的用法例子(转)
    pandas.DataFrame.sample随机抽样
    最全的MonkeyRunner自动化测试从入门到精通(1)
    阿里创新自动化测试工具平台--Doom
  • 原文地址:https://www.cnblogs.com/xiaoshahai/p/14654130.html
Copyright © 2020-2023  润新知