2023年7月21日发(作者:)
springboot@schedule和@Async定时任务的异步同步多任务并发@schedule@schedule注解参数有如下
cron:cron表达式,指定任务在特定时间执⾏;
fixedDelay:表⽰上⼀次任务执⾏完成后多久再次执⾏,参数类型为long,单位ms;
fixedDelayString:与fixedDelay含义⼀样,只是参数类型变为String;
fixedRate:表⽰按⼀定的频率执⾏任务,参数类型为long,单位ms;
fixedRateString: 与fixedRate的含义⼀样,只是将参数类型变为String;
initialDelay:表⽰延迟多久再第⼀次执⾏任务,参数类型为long,单位ms; * initialDelayString:与initialDelay的含义⼀样,只是将参数类型变为String;Delay的Rate区别在于Delay是任务完成之后多久执⾏, Rate是任务开始之后多久执⾏,⼀个是按完成时间计时 ⼀个是按开始时间计时@schedule原理@schedule底层使⽤的是spring的任务调度线程池ThreadPoolTaskScheduler,ThreadPoolTaskScheduler底层使⽤的为JDK⾃带的ScheduledExecutorService(其实现类为ScheduledThreadPoolExecutor)第⼀步 将任务添加到线程池的任务队列中 此处知识点: 1 线程池:ScheduledThreadPoolExecutor 继承 ThreadPoolExecutor所以此处线程池为
ThreadPoolExecutor第⼆步 线程池中的线程获取到延时队列中的任务第⼀次执⾏第三步 延时队列中任务被线程执⾏完毕之后,重新根据我们传⼊的时间频率设置这个任务的时间放⼊到延时队列中,以此达到
任务被周期性反复的⼀直调⽤因为任务执⾏完之后才被放⼊到队列中再次选取线程执⾏ 所以定时任务线程池中不管有多少线程,只有⼀个线程执⾏这个任务,这个任务结束之后,也会重新选取⼀个线程再次执⾏注意:在spring中的@schedule默认的线程池中只有⼀个线程,所以如果在多个⽅法上加上@schedule的话,此时就会有多个任务加⼊到延时队列中,因为只有⼀个线程,所以任务只能被⼀个⼀个的执⾏在使⽤时我们可以按需配置定时任务线程池线程的⼤⼩,这个就改变了线程数量默认为1的线程池@Bean("threadPoolTaskScheduler") public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler(); eadNamePrefix("threadPoolTaskScheduler-"); lSize(20); //设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean tForTasksToCompleteOnShutdown(true); //设置线程池中任务的等待时间,如果超过这个时候还没有销毁就强制销毁,以确保应⽤最后能够被关闭,⽽不是阻塞住 itTerminationSeconds(60); ectedExecutionHandler(new RunsPolicy()); return executor; } //这⾥采⽤了CallerRunsPolicy策略,当线程池没有处理能⼒的时候,该策略会直接在 execute ⽅法的调⽤线程中运⾏被拒绝的任务;如果执⾏程序已关闭,则会@Async此注解会将这个任务放⼊到⼀个异步线程中执⾏,不会阻塞主线程,可以⽤在⼀些⽐较耗时并且不⽤考虑返回值的⼀些操作中⽐如有⼀个任务是3秒执⾏⼀次,⼀次任务执⾏需要8秒,若是吧这个任务加上@Async则这个任务就会放⼊到异步线程中去,则这个任务不管这个任务执⾏的8秒还是依然会3秒执⾏⼀次,只是每次执⾏的结果需要8秒钟的延迟,但是结果我们⼀般是不考虑的总结① 默认@schedule 线程池默认只有⼀个线程,多个任务时串⾏ 串⾏@ 配置ThreadPoolTaskScheduler的@schedule 指定线程池中线程数量,多个任务并⾏ 并⾏@ 默认@schedule + @Aysnc 多个任务之间串⾏,单个任务⾮阻塞异步执⾏ 串⾏+异步@ 配置ThreadPoolTaskScheduler的@schedule+@Async 多个任务之间并⾏,单个任务⾮阻塞异步执⾏ 并⾏+异步
发布者:admin,转转请注明出处:http://www.yc00.com/news/1689931320a295290.html
评论列表(0条)