这篇文章主要介绍了springBoot @Scheduled实现多个任务同时开始执行,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
@Scheduled 多个定时任务同时执行
1、定时任务是单线程运行的
定时任务是单线程执行的,默认一个时间段只能执行一个定时任务
如果多个定时任务同时执行的话,那么会按照顺序执行
2、多线程开启定时任务
创建线程池,且注入到spring 中,
@EnableScheduling 定时任务扫描,开始定时任务计划支持
@Service
@Component
@EnableScheduling
public class SendMsgNoticeServiceTimer {
private static final Logger logger = LoggerFactory.getLogger(SendMsgNoticeServiceTimer.class);
@Autowired
private NySendMsg nySendMsg;
//创建定时任务线程池
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(64);
return taskScheduler;
}
@Scheduled(cron="0 0 10 * * ?")
public void sendPaymentNotice() {
logger.info("***-sendPaymentNotice--定时任务每天凌晨10点执行一次---***");
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
String endDate = sf.format(new Date());
JSONObject obj = sendTradingFeeChoosed(String.valueOf(1));
logger.info("***---定时任务" + endDate + ":系统自动发送" + obj.size() + "条短信提醒---***");
}
@Scheduled(cron="0 0 10 * * ?")
public void sendLateRemind() {
logger.info("***--sendLateRemind---定时任务每天凌晨10点执行一次---***");
SimpleDateFormat sf = new SimpleDateFormat("yyyyMMdd");
String endDate = sf.format(new Date());
JSONObject obj = sendTradingFeeChoosed(String.valueOf(2));
logger.info("***---定时任务" + endDate + ":系统自动发送" + obj.size() + "条短信提醒---***");
}
}
总结:
@Scheduled
是 Spring 框架中用于创建定时任务的注解,它可以用于方法上,允许你定义方法在指定的时间间隔或固定时间点执行。如果你有多个使用 @Scheduled
注解的方法,它们默认会在相应的时间点并行执行。在这种情况下,需要注意一些问题来确保多个定时任务能够同时执行而不发生冲突。
以下是关于@Scheduled
多个定时任务同时执行的一些方法总结:
-
线程安全性: 确保你的定时任务方法是线程安全的。因为多个定时任务方法会并行执行,如果这些方法操作了共享资源,你需要考虑线程安全问题,使用同步或其他线程安全机制来避免竞态条件。
-
任务间隔与执行时间: 注意多个定时任务的执行时间和间隔。如果某个任务的执行时间比较长,可能会影响其他任务的正常执行。确保任务的执行时间不会导致任务之间的间隔过小,以免任务之间相互影响。
-
线程池配置: Spring 使用一个线程池来执行定时任务,默认情况下,线程池大小为1,意味着所有的定时任务都在同一个线程中执行。你可以通过配置
ThreadPoolTaskScheduler
或TaskScheduler
的 bean 来自定义线程池,以控制定时任务的并发度。 -
任务优先级: 如果你希望某个定时任务有更高的优先级,你可以通过合理调整线程池的大小或使用不同的线程池来实现。请注意,过多的线程可能会导致资源竞争和性能问题,因此需要平衡优先级和系统资源。
-
日志和异常处理: 为了方便调试和监控,定时任务应该记录适当的日志信息。另外,定时任务方法可能会抛出异常,你需要适当地处理这些异常,以避免影响其他任务的执行。
-
分布式环境: 如果你的应用是分布式的,多个实例同时执行定时任务,你需要确保定时任务在分布式环境下的唯一性,避免重复执行。可以使用分布式锁或其他分布式协调机制来实现。
-
任务耗时监控: 为了确保定时任务的性能和稳定性,可以通过监控系统来收集任务的执行时间和执行次数等信息,以及慢任务的排查和优化。
总之,@Scheduled
注解允许你在 Spring 中方便地创建定时任务,但在多个定时任务同时执行时,需要考虑线程安全、任务间隔、线程池配置、异常处理等因素,以确保定时任务能够在并行执行时保持稳定和高效。
原创声明
原创作者: 猫头虎
本文转自 https://blog.csdn.net/qq_44866828/article/details/124477355,如有侵权,请联系删除。