zoukankan      html  css  js  c++  java
  • spring-boot自定义线程池

    • 在Spring Boot主类中定义一个线程池,比如:
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    
        @EnableAsync
        @Configuration
        class TaskPoolConfig {
            @Bean("taskExecutor")
            public Executor taskExecutor() {
                ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
                executor.setCorePoolSize(10);
                executor.setMaxPoolSize(20);
                executor.setQueueCapacity(200);
                executor.setKeepAliveSeconds(60);
                executor.setThreadNamePrefix("taskExecutor-");
                executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                executor.setWaitForTasksToCompleteOnShutdown(true);
                executor.setAwaitTerminationSeconds(60);
                return executor;
            }
        }
    }
    

    上面我们通过ThreadPoolTaskExecutor创建了一个线程池,同时设置了如下参数:

    • 核心线程数10:线程池创建时初始化的线程数
    • 最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
    • 缓冲队列200:用来缓冲执行任务的队列
    • 允许线程的空闲时间60秒:超过了核心线程数之外的线程,在空闲时间到达之后会被销毁
    • 线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
    • 线程池对拒绝任务的处理策略:此处采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,该策略会直接在execute方法的调用线程中运行被拒绝的任务;如果执行程序已被关闭,则会丢弃该任务
    • 设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean
    • 设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应用最后能够被关闭,而不是阻塞住
    使用线程池
    • 只需要在@Async注解中指定线程池名即可
    @Slf4j
    @Component
    public class Task {
    
        public static Random random = new Random();
    
        @Async("taskExecutor")
        public void doTaskOne() throws Exception {
            log.info("开始做任务一");
            long start = System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            long end = System.currentTimeMillis();
            log.info("完成任务一,耗时:" + (end - start) + "毫秒");
        }
    
        @Async("taskExecutor")
        public void doTaskTwo() throws Exception {
            log.info("开始做任务二");
            long start = System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            long end = System.currentTimeMillis();
            log.info("完成任务二,耗时:" + (end - start) + "毫秒");
        }
    
        @Async("taskExecutor")
        public void doTaskThree() throws Exception {
            log.info("开始做任务三");
            long start = System.currentTimeMillis();
            Thread.sleep(random.nextInt(10000));
            long end = System.currentTimeMillis();
            log.info("完成任务三,耗时:" + (end - start) + "毫秒");
        }
    }
    
    • 测试
    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Autowired
        private Task task;
    
        @Test
        public void test() throws Exception {
    
            task.doTaskOne();
            task.doTaskTwo();
            task.doTaskThree();
            Thread.currentThread().join();
        }
    }


    作者:Dear_diary
    链接:https://www.jianshu.com/p/a13ac0d774c6
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 相关阅读:
    算法设计和分析(Prim算法构建最小生成树)
    寒假第二阶段集训第6天
    2.4 综合训练
    1月18日 LCA专项训练
    易班易喵喵话题动态自动统计
    P2590 [ZJOI2008]树的统计
    P3038 [USACO11DEC]牧草种植Grass Planting
    2157: 旅游
    P2787 语文1(chin1)- 理理思维
    F. Make Them Similar
  • 原文地址:https://www.cnblogs.com/zeenzhou/p/12664154.html
Copyright © 2011-2022 走看看