主要想弄清使用Spring @Scheduler cron表达式时的两个问题:

  • 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?
  • 不同的定时任务,相互之间是否有影响?

结论写在前面:

  • 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?不会,会等前一次执行完成才执行下一次
  • 不同的定时任务,相互之间是否有影响?取决于可用的定时任务线程数,如果线程数足够则不会影响;如果可用定时任务线程数少于要执行定时任务数量,未能获取到线程的自然要等到有空闲线程时才能执行。

下面是实验过程。。。。。

使用Spring @Scheduler 时,默认只有一个线程,针对上面的问题,设计了3个实验:

  1. 设置Scheduler为多线程,设置一个线程5秒执行一次,方法体为 sleep8秒
  2. 使用Scheduler默认的单线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep
  3. 设置Scheduler为多线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep

实验一

设置Scheduler为多线程,设置一个线程5秒执行一次,方法体为 sleep8秒:

    @Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
}

结果:

2017-10-11 17:49:45 scheduler-1 test1, 5秒执行一次,每次执行sleep 8

2017-10-11 17:49:55 scheduler-1 test1, 5秒执行一次,每次执行sleep 8

2017-10-11 17:50:05 scheduler-1 test1, 5秒执行一次,每次执行sleep 8

2017-10-11 17:50:15 scheduler-2 test1, 5秒执行一次,每次执行sleep 8

2017-10-11 17:50:25 scheduler-2 test1, 5秒执行一次,每次执行sleep 8

2017-10-11 17:50:35 scheduler-1 test1, 5秒执行一次,每次执行sleep 8

结论:

@Scheduled使用cron表达式,设置为多线程时,同一任务前一次没有执行完成,不会执行下一次

实验二

使用Scheduler默认的单线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep

  • 如果test2每8秒执行一次,则为串行
	@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
System.out.println("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
} @Scheduled(cron = "*/5 * * * * *")
public void test2() {
System.out.println("test2, 5秒执行一次,不sleep");
}

执行结果:

2017-10-11 17:17:35 test2, 5秒执行一次,不sleep

2017-10-11 17:17:35 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 17:17:43 test2, 5秒执行一次,不sleep

2017-10-11 17:17:45 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 17:17:53 test2, 5秒执行一次,不sleep

2017-10-11 17:17:55 test2, 5秒执行一次,不sleep

2017-10-11 17:17:55 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 17:18:03 test2, 5秒执行一次,不sleep

2017-10-11 17:18:05 test2, 5秒执行一次,不sleep

2017-10-11 17:18:05 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 17:18:13 test2, 5秒执行一次,不sleep

2017-10-11 17:18:15 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 17:18:23 test2, 5秒执行一次,不sleep

2017-10-11 17:18:25 test1, 5秒执行一次,每次执行sleep 8s

对比期望执行时间:

执行次数 task 期望执行时间 实际执行时间
1 task1 17:17:35 17:17:35
1 task2 17:17:35 17:17:35
2 task1 17:17:40 17:17:43
2 task2 17:17:40 17:17:45

结论:

@Scheduled使用cron表达式 ,配置为一个线程时,不同定时任务是串行执行,且上次没有执行完时不会执行下次

实验三

设置Scheduler为多线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep

	@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
} @Scheduled(cron = "*/5 * * * * *")
public void test2() {
log.info("test2, 5秒执行一次,不sleep");
}

结果:

2017-10-11 18:12:40 scheduler-2 test2, 5秒执行一次,不sleep

2017-10-11 18:12:40 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 18:12:45 scheduler-2 test2, 5秒执行一次,不sleep

2017-10-11 18:12:50 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s

2017-10-11 18:12:50 scheduler-2 test2, 5秒执行一次,不sleep

2017-10-11 18:12:55 scheduler-2 test2, 5秒执行一次,不sleep

2017-10-11 18:13:00 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s

对比期望执行时间:

执行次数 task 期望执行时间 实际执行时间
1 task1 18:12:40 18:12:40
1 task2 18:12:40 18:12:40
2 task1 18:12:45 18:12:50
2 task2 18:12:45 18:12:45

结论:

@Scheduled使用cron表达式 ,配置为多线程时,不同定时任务不是串行执行,且上次没有执行完时不会执行下次

设置定时任务为多线程

这里用的是spring boot:

@Configuration
public class ScheduleConfig { @Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(3);
scheduler.setThreadNamePrefix("scheduler-");
return scheduler;
} }

Spring @Scheduler使用cron时的执行问题的更多相关文章

  1. shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决(XML配置)

    在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解@RequiresPermissions为方法提供是需要的权限,但是 ...

  2. 转载:如何让spring mvc web应用启动时就执行

    转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...

  3. Spring ——获取IOC容器时,构造方法、set方法、类方法执行顺序

    1,首先,我们在ApplicationContext.xml中会写下下面类的标示: <bean id="helloword" class="com.xt.frist ...

  4. spring mvc web应用启动时就执行特定处理(线程启动)

    package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...

  5. Spring Scheduler定时任务 + Quartz

    原文地址: https://blog.csdn.net/revitalizing/article/details/61420556 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...

  6. Spring 注解 @Scheduled(cron = "0 0/10 * * * ? ") 任务调度动态改变时间

    不需要重启应用就可以动态的改变Cron表达式的值 import java.util.Date; import java.util.concurrent.Executor; import java.ut ...

  7. Quartz 用 cron 表达式存放执行计划

    Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上. 1.Quartz cron 表达式支持七个域如下: 名称 是否 ...

  8. 详解如何在 Linux 启动时自动执行命令或脚本

    我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...

  9. Spring 计时器 @Scheduled cron 含义

    Spring 计时器 @Scheduled cron 含义 学习:http://blog.csdn.net/prisonbreak_/article/details/49180307 http://b ...

随机推荐

  1. mysql状态分析之show global status

    这里整理下mysql global status的相关命令,在计算监控数据的时候需要用到 一.慢查询 show variables like '%slow%'; +------------------ ...

  2. MapReduce辅助排序

    需求:订单数据 求出每个订单中最贵的商品? 订单id正序,成交金额倒序. 结果文件三个,每个结果文件只要一条数据. 1.Mapper类 package com.css.order.mr; import ...

  3. x86架构下的控制寄存器CR0-CR4

    关于这几个寄存器,每次翻看intel手册都很不好找,干脆直接贴在这里吧!

  4. vSphere虚拟机磁盘热扩容

    1.添加硬盘 2.刷新服务器文件系统 新添加的硬盘需要刷新文件系统,要不然不能识别新添加的硬盘. 对scsi_host进行重新扫描,查找 scsi 驱动器的号 驱动号为scsi后面的数字,即为2,此时 ...

  5. 安装python3 centos

    1.在新centos中安装python3的步骤https://www.cnblogs.com/lclq/archive/2016/06/27/5620196.html 2.安装python3过程中报错 ...

  6. JavaWeb—Session与Cookie

    概念 会话:指从一个浏览器窗口打开到关闭期间的一系列动作(可简单理解为用户开一个浏览器,点击多个链接,访问服务器多个web资源,然后关闭浏览器). HTTP协议是无状态协议:每次连接(比如同一个网站的 ...

  7. UVA10763:Foreign Exchange&&UVA10340: All in All(水题)

    10763:水题不解释直接贴代码. #include <iostream> #include <string.h> #include <stdio.h> #incl ...

  8. Linux文件权限分析

    一.用户组概念  在linux系统中,每个用户必属于一个组,不能独立于组之外.每个文件都有所有者,所在组和其他组这三个概念. (1)所有者:一般为文件的创建者,谁创建了该文件,就成为了该文件的所有者, ...

  9. 细说PHP的FPM

    ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++基础概念++ C ...

  10. Winter-1-A A + B 解题报告及测试数据

    Time Limit:1000MS Memory Limit:32768KB Description Calculate A + B. Input Each line will contain two ...