SpringBoot使用@scheduled定时执行任务的时候是在一个单线程中,如果有多个任务,其中一个任务执行时间过长,则有可能会导致其他后续任务被阻塞直到该任务执行完成。也就是会造成一些任务无法定时执行的错觉
无论@scheduled是用在一个类的多个方法还是用在多个类中的方法 默认都是单线程的。
类 task1和类task2 都有task()方法
task1和task2都是每秒执行一次 task1 每次睡眠1s task2每次睡眠10s 测试结果发现 task2会造成task1的阻塞。
所以task1和task2的定时任务是单线程的要避免阻塞
要在每个类中加上线程池
ExecutorService service = Executors.newFixedThreadPool(1); 这样每次task1和task2执行的时候就会互不影响。
newFixedThreadPool(1); 中的线程池大小要根据具体的业务来定 。
看你想要每个任务按照每1s执行一次 还是要按照每个任务按照串行来执行。
如果是串行只需要给这个任务的线程池大小设置成1 这样即便任务设置的是1s执行一次 ,但是这个任务执行耗时10s。那么他也会等上次执行完以后才会进行下一次执行。