当前位置:   article > 正文

spring boot默认单线程如何破解?_springboot 多线程

springboot 多线程

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiY5oiY55qE5Z2a5p6c,size_20,color_FFFFFF,t_70,g_se,x_16

由上面可以看到我有两个定时,但是用的是一个线程。

方法一:添加@Async注解后发现不再是同一个线程,而是使用多个线程了。

因为这个@Async注解,就相当于new Thread().start(); 所以可以看到现在是两个线程在跑。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiY5oiY55qE5Z2a5p6c,size_20,color_FFFFFF,t_70,g_se,x_16

 

方法二:写一个ThreadPoolTaskScheduler注入到容器,则定时任务默认就用的这个定时多线程

  1. @Bean
  2. public ThreadPoolTaskScheduler getThreadPoolTaskScheduler(){
  3. // 设置线程数
  4. ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
  5. //最大线程数
  6. scheduler.setPoolSize(50);
  7. return scheduler;
  8. }

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiY5oiY55qE5Z2a5p6c,size_20,color_FFFFFF,t_70,g_se,x_16

由此可以看出 也是开了两个线程在跑。

方法三:写一个普通的多线程bean,在每个线程上使用@Async注解

  1. //bean的名称,默认是首字母小写的方法名
  2. @Bean("threadPoolTaskExecutor")
  3. public ThreadPoolTaskExecutor getThreadPoolTaskExecutor(){
  4. // 设置线程数
  5. ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
  6. //核心线程数
  7. taskExecutor.setCorePoolSize(25);
  8. //最大线程数
  9. taskExecutor.setMaxPoolSize(50);
  10. //阻塞队列
  11. taskExecutor.setQueueCapacity(100);
  12. //初始化线程
  13. taskExecutor.initialize();
  14. return taskExecutor;
  15. }

因为@Async异步方法默认使用Spring创建ThreadPoolTaskExecutor。默认核心线程数:8,最大线程数:Integer.MAX_VALUE,队列使用LinkedBlockingQueue,容量是:Integer.MAX_VALUE,空闲线程保留时间:60s,线程池拒绝策略:AbortPolicy。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oiY5oiY55qE5Z2a5p6c,size_20,color_FFFFFF,t_70,g_se,x_16

 由此也可看出,使用的也是两个线程!

 

自定义线程

  1. //线程池最好是自定义,因为性能等信息可以由开发者自己控制,不然默认使用SimpleAsyncTaskExecutor
  2. @Bean
  3. public Executor getExecutor(){
  4. // 设置线程数
  5. ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
  6. //最大线程数
  7. threadPoolTaskExecutor.setMaxPoolSize(20);
  8. //核心线程池大小
  9. threadPoolTaskExecutor.setCorePoolSize(10);
  10. //队列容量
  11. threadPoolTaskExecutor.setQueueCapacity(200);
  12. //活跃时间
  13. threadPoolTaskExecutor.setKeepAliveSeconds(60);
  14. //线程名称前缀
  15. threadPoolTaskExecutor.setThreadNamePrefix("taskExecutor-");
  16. return threadPoolTaskExecutor;
  17. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/52439
推荐阅读
相关标签
  

闽ICP备14008679号