开启定时任务
-
在启动类加 @EnableScheduling 注解
-
定时任务类加 @Component 注解
-
定时任务方法加 @Scheduled(cron = “10 0/1 * * * *”) 注解,corn表达式网上很多
-
配置定时任务执行线程池,springboot默认定时任务线程池大小为1,参见 ThreadPoolTaskScheduler.class
@Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler(); taskScheduler.setPoolSize(10); return taskScheduler; }
并行执行定时任务
[getDefaultManagedTaskScheduler-1]定时任务1开始
Thread.sleep(2000)
[getDefaultManagedTaskScheduler-1]定时任务1结束
[getDefaultManagedTaskScheduler-3]定时任务2开始
Thread.sleep(2000)
[getDefaultManagedTaskScheduler-3]定时任务2结束
可以看到任务虽然不是一个线程执行的,但两个线程是阻塞执行的,具体原因还未了解
2019年5月16日更新
原因找到了,因为是集群,所以方法加了 @Synchronized
方案一
class ScheduleTask {
@Scheduled(cron = "10 0/1 * * * *")
public void schedule1() {
//1开始
new Thread {
。。。
}
//1结束
}
@Scheduled(cron = "10 0/1 * * * *")
public void schedule2() {
//2开始
new Thread {
。。。
}
//2结束
}
}
方案二
class ScheduleTask1 {
@Scheduled(cron = "10 0/1 * * * *")
public void schedule1() {
//1开始
new Thread {
。。。
}
//1结束
}
}
class ScheduleTask2 {
@Scheduled(cron = "10 0/1 * * * *")
public void schedule2() {
//2开始
new Thread {
。。。
}
//2结束
}
}
结果:
[getDefaultManagedTaskScheduler-1]定时任务1开始
[getDefaultManagedTaskScheduler-3]定时任务2开始
Thread.sleep(2000)
[getDefaultManagedTaskScheduler-1]定时任务1结束
Thread.sleep(2000)
[getDefaultManagedTaskScheduler-3]定时任务2结束
结论
这两种实现方式都不算最终的解决方式,只是能解决问题而已,大神们说下最好的解决方式
转载请注明出处:https://blog.csdn.net/weixin_38367349/article/details/90242732