SpringBoot中的异步任务解析
默认线程池:
使用方式: 开启异步任务,在启动类上使用注解@EnableAsync启动异步任务,在需要异步执行的任务上使用@Async标注该方法为异步任务。
执行任务效果:
自定义线程池:
使用方式: 创建线程池配置类,对线程池核心线程数量、最大线程数量、空闲线程数量、任务队列以及拒绝策略的设置,在线程池配置类上使用@Configuration进行配置文件装配,对需要异步执行的任务上标明线程池名称即可使用指定的线程池执行任务,不标注则为默认线程池执行。
//@Configuration public class TheadPoolTaskConfig { // 核心线程数 private static final int corePoolSize = 20; // 最大线程数 private static final int maxPoolSize = 50; // 允许线程空闲时间 private static final int keepAliveTime = 10; // 缓冲队列大小 private static final int queueCopcity = 200; // 线程池前缀 private static final String threadNamePrefix = "Xyamc-Thread-Service-"; @Bean("xyamcTaskExcutor") public ThreadPoolTaskExecutor startTask(){ ThreadPoolTaskExecutor pool = new ThreadPoolTaskExecutor(); pool.setCorePoolSize(corePoolSize); pool.setMaxPoolSize(maxPoolSize); pool.setQueueCapacity(queueCopcity); pool.setKeepAliveSeconds(keepAliveTime); pool.setThreadNamePrefix(threadNamePrefix); // 线程池拒绝策略 pool.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); pool.initialize(); return pool; } }
@RequestMapping(value = "/test1", method = RequestMethod.GET) @ApiOperation(value = "执行默认线程池异步任务") public Result<?> test1(HttpServletRequest req, HttpServletResponse response) { iTestService.printSecond(); return Result.ok("同步任务执行成功!"); }
@Override // @Async("xyamcTaskExcutor") public void printSecond() { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); log.info("异步任务开始执行时间:{}", format.format(date)); try { Thread.sleep(30000); Thread thread = Thread.currentThread(); log.info("当前线程名称:{}", thread.getName()); Date date1 = new Date(); log.info("异步任务执行结束时间:{}", format.format(date1)); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("异步任务执行成功!"); }
线程池拒绝策略
DiscardPolicy 直接丢弃
从上图可知,线程没有做任何处理,直接悄悄的丢弃。
AbortPolicy 直接拒绝策略
从上图可以看出,线程直接抛出拒绝异常。
DiscardOldestPolicy 弃老策略
从上图可以看出,线程会丢弃最开始进去,然后尝试重新执行。
CallerRunsPolicy
线程池没有关闭,就交给线程本身自己去执行。
到此这篇关于SpringBoot中的异步任务解析的文章就介绍到这了,更多相关SpringBoot异步任务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring Cloud Gateway 内存溢出的解决方案
这篇文章主要介绍了Spring Cloud Gateway 内存溢出的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2021-07-07spring cloud gateway中netty线程池小优化
这篇文章主要介绍了spring cloud gateway中netty线程池小优化技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07
最新评论