赞
踩
spring boot默认是单线程的,当有多个定时需要跑的时候,他会等到上一个定时跑完再跑下一个定时,而下一个定时一直处于等待状态,若定时很多的话,严重会引起雪崩。。。

由上面可以看到我有两个定时,但是用的是一个线程。
方法一:添加@Async注解后发现不再是同一个线程,而是使用多个线程了。
因为这个@Async注解,就相当于new Thread().start(); 所以可以看到现在是两个线程在跑。

方法二:写一个ThreadPoolTaskScheduler注入到容器,则定时任务默认就用的这个定时多线程
- @Bean
- public ThreadPoolTaskScheduler getThreadPoolTaskScheduler(){
- // 设置线程数
- ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
- //最大线程数
- scheduler.setPoolSize(50);
- return scheduler;
- }

由此可以看出 也是开了两个线程在跑。
方法三:写一个普通的多线程bean,在每个线程上使用@Async注解
- //bean的名称,默认是首字母小写的方法名
- @Bean("threadPoolTaskExecutor")
- public ThreadPoolTaskExecutor getThreadPoolTaskExecutor(){
- // 设置线程数
- ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
- //核心线程数
- taskExecutor.setCorePoolSize(25);
- //最大线程数
- taskExecutor.setMaxPoolSize(50);
- //阻塞队列
- taskExecutor.setQueueCapacity(100);
- //初始化线程
- taskExecutor.initialize();
- return taskExecutor;
- }
因为@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor。默认核心线程数:8,最大线程数:Integer.MAX_VALUE,队列使用LinkedBlockingQueue,容量是:Integer.MAX_VALUE,空闲线程保留时间:60s,线程池拒绝策略:AbortPolicy。

由此也可看出,使用的也是两个线程!
自定义线程
- //线程池最好是自定义,因为性能等信息可以由开发者自己控制,不然默认使用SimpleAsyncTaskExecutor
- @Bean
- public Executor getExecutor(){
- // 设置线程数
- ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
- //最大线程数
- threadPoolTaskExecutor.setMaxPoolSize(20);
- //核心线程池大小
- threadPoolTaskExecutor.setCorePoolSize(10);
- //队列容量
- threadPoolTaskExecutor.setQueueCapacity(200);
- //活跃时间
- threadPoolTaskExecutor.setKeepAliveSeconds(60);
- //线程名称前缀
- threadPoolTaskExecutor.setThreadNamePrefix("taskExecutor-");
- return threadPoolTaskExecutor;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。