springboot异步执行
1.启动类在这里插入代码片

@SpringBootApplication
public class ThreadStudyApplication {public static void main(String[] args) {SpringApplication springApplication = new SpringApplication(ThreadStudyApplication.class);springApplication.setBannerMode(Banner.Mode.OFF);springApplication.run(args);}
}

2.配置类

@EnableAsync
@Configuration
public class TaskPoolConfig {/*使用自定义的线程池
*/@Bean("taskExecutor")public Executor taskExecutor() {//rejectedExecutionHandler:对拒绝task的处理策略ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();//线程池维护线程的最少数量executor.setCorePoolSize(10);//线程池维护线程的最大数量executor.setMaxPoolSize(20);executor.setQueueCapacity(200);//允许的空闲时间executor.setKeepAliveSeconds(60);// 线程池名称executor.setThreadNamePrefix("taskExecutor-");// WaitForTasksToCompleteOnShutdown=true(默认为false),表明等待所有线程执行完executor.setWaitForTasksToCompleteOnShutdown(true);//主线程会处于一种等待的状态,等待线程池中所有的线程都运行完毕后才继续运行executor.setAwaitTerminationSeconds(60);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());// 初始化executor.initialize();return executor;}
}

3.任务类

@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(500);long end = System.currentTimeMillis();log.info("完成任务一,耗时:" + (end - start) + "毫秒");log.info(Thread.currentThread().getName());}@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) + "毫秒");}}

4.测试

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class ThreadStudyApplicationTest {@Autowiredprivate Task task;@Testpublic void test() throws Exception {for (int i = 0; i < 1000; i++) {task.doTaskOne();}}
}

线程池核心概念介绍:
**
1.拒绝策略
rejectedExecutionHandler字段用于配置拒绝策略,常用的拒绝策略如下:

AbortPolicy,用于被拒绝任务的处理程序,它将抛出RejectedExecutionException。
CallerRunsPolicy,用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务。
DiscardOldestPolicy,用于被拒绝任务的处理程序,它放弃最旧的未处理请求,然后重试execute。
DiscardPolicy,用于被拒绝任务的处理程序,默认情况下它将丢弃被拒绝的任务。
其他说明:

为了实现某些特殊的业务需求,用户可以选择使用自定义策略,只需实现RejectedExecutionHandler接口即可。
建议配置threadNamePrefix属性,出问题时可以更方便的进行排查。
2.关闭线程池
调用shutdown或者shutdownNow,两者都不会接受新的任务,而且通过调用要停止线程的interrupt方法来中断线程,有可能线程永远不会被中断,不同之处在于shutdownNow会首先将线程池的状态设置为STOP,然后尝试停止所有线程(有可能导致部分任务没有执行完)然后返回未执行任务的列表。而shutdown则只是将线程池的状态设置为shutdown,然后中断所有没有执行任务的线程,并将剩余的任务执行完。
3.配置线程个数
如果是CPU密集型任务,那么线程池的线程个数应该尽量少一些,一般为CPU的个数+1条线程。
如果是IO密集型任务,那么线程池的线程可以放的很大,如2*CPU的个数。
对于混合型任务,如果可以拆分的话,通过拆分成CPU密集型和IO密集型两种来提高执行效率;如果不能拆分的的话就可以根据实际情况来调整线程池中线程的个数
4.监控线程池状态
常用状态:
taskCount:线程需要执行的任务个数。
completedTaskCount:线程池在运行过程中已完成的任务数。
largestPoolSize:线程池曾经创建过的最大线程数量。
getPoolSize获取当前线程池的线程数量。
getActiveCount:获取活动的线程的数量
通过继承线程池,重写beforeExecute,afterExecute和terminated方法来在线程执行任务前,线程执行任务结束,和线程终结前获取线程的运行情况,根据具体情况调整线程池的线程数量。

springboot 使用spring的线程池异步执行相关推荐

  1. 【二十四】springboot使用EasyExcel和线程池实现多线程导入Excel数据

      springboot篇章整体栏目:  [一]springboot整合swagger(超详细 [二]springboot整合swagger(自定义)(超详细) [三]springboot整合toke ...

  2. Java和Spring中线程池创建方法

    一.线程池定义 1.JDK中线程池类图 Executor:父接口,所有线程池都实现了这个接口,里面有一个excute()方法用于执行线程 ExecutorService:线程池接口,继承自Execut ...

  3. Spring Boot 线程池

    参考 SpringBoot 线程池 程序猿DD-Spring Boot使用@Async实现异步调用:自定义线程池 如何优雅的使用和理解线程池 Spring Boot线程池的使用心得 博客园-Sprin ...

  4. async spring 默认线程池_SpringBoot中Async异步方法和定时任务介绍

    1.功能说明 Spring提供了Async注解来实现方法的异步调用.即当调用Async标识的方法时,调用线程不会等待被调用方法执行完成即返回继续执行以下操作,而被调用的方法则会启动一个独立线程来执行此 ...

  5. async spring 默认线程池_Spring定时任务高级使用篇

    I. 定时任务进阶篇 1. 问题小结 之前写过一篇博文,抛出了下面的几个问题,接下来则围绕问题进行分析 一个项目中有多个定时任务时,他们是并行执行的还是串行执行的? 如果默认是串行的 那么有相同的cr ...

  6. 线程池异步线程中再次获取线程池资源的问题

    问题描述 在线上发生的一次问题, 在场景中有这样一个业务, 需要异步执行一个主任务, 主任务中又包含着N个子任务, 为了整个主任务能够快速处理, 又将子任务按照数量获取线程资源异步处理, 即异步线程A ...

  7. Spring集成线程池

    自己在程序中手动New很容易造成线程滥用,创建线程也是比较消耗资源的操作,所以建议如果有此需求,将线程池统一交给Spring框架进行管理. 如下: <!--Spring 集成线程池,不允许自己开 ...

  8. 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )

    文章目录 一.EventBus 中主线程支持类 二.EventBus 中 AsyncPoster 分析 三.AsyncPoster 线程池 Runnable 任务类 一.EventBus 中主线程支持 ...

  9. JAVA编码(41)—— 线程池队列执行任务(ThreadPoolQueue)(1)

    废话少说,上代码 package com.sinosoft;import java.util.concurrent.*;/*** Created by xushuyi on 2017/4/9.*/ p ...

最新文章

  1. Java数组中文排序_Java模块 -- 数组/集合中文汉字排序(支持生僻汉字)
  2. 配置内存中OLTP文件组提高性能
  3. Ubuntu安装webmin
  4. (最小生成树) Networking -- POJ -- 1287
  5. AUTOMAKE\AUTOCONF
  6. OpenCV实现视频人脸检测
  7. java 缓存 30秒后失效_如何处理缓存失效、缓存穿透、缓存并发等问题
  8. Nacos 快速开始
  9. 做arma模型步骤_互助问答第349期:关于ARMA预测模型的问题
  10. 火爆的文字游戏你玩了吗?「GitHub 热点速览 v.22.06」
  11. 单片机小白学步系列(八) 用面包板搭建实验电路
  12. 2022基金从业人员资格管理及后续职业培训 部分答案(自答)
  13. linux 虚拟光驱软件,Ubuntu Linux下强大的虚拟光驱软件 :AcetoneISO
  14. HR面试程序员,背调其前同事发现他人品差:能力和人品哪个重要?
  15. python爬iptv直播源脚本_GitHub - Good0007/iptv-m3u-maker: IPTV 国内+国外 电视台直播源m3u文件, 收集汇总本地源脚本...
  16. vant 固定定位不生效
  17. java pdf文件下载_Java后台返回PDF文件预览下载
  18. vivo联合天猫超品日共同打造X70系列城市影像馆
  19. Debian 7.x 安装教程、网络配置、软件源配置、磁盘分区、LVM、U盘安装、网络安装...
  20. 【完美解决】android开发 自定义字体安装包过大的问题

热门文章

  1. 动态规划法(九)想要更多例子? 1
  2. dyld Library not loaded @rpath libswiftCore dylib 解决
  3. php中常用的字符串获取函数mb_strcut实例解释
  4. 粒子效果的开始和结束颜色属性
  5. Android SQLite简单操作示例
  6. 使用IE过渡滤镜和CSS3中的RGBA属性完成背景色透明效果
  7. Tips/Tricks#4:不同页面之间传递值
  8. linux select函数用法
  9. OpenWrt的主Makefile工作过程-转
  10. Mac Safari浏览器的阅读列表与iPhone、iPad (iOS)不同步的问题