主要想弄清使用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. angularJs-脏检查

    来自:http://www.cnblogs.com/liuyanan/p/4935652.html scope是一个指向应用model的object,也是表达式的执行上下文. scope被放置在一个类 ...

  2. nested exception is java.lang.IllegalStateException: Context namespace element 'annotation-config' a

    公司还用的是spring低版本,今天用jre 8测试了一下,发现错误: Unexpected exception parsing XML document from class path resour ...

  3. If the parts of an organization (e.g., teams, departments, or subdivisions) do not closely reflect the essential parts of the product, or if the relationship between organizations do not reflect the r

    https://en.wikipedia.org/wiki/Conway%27s_law

  4. Spark源码分析 – SparkEnv

    SparkEnv在两个地方会被创建, 由于SparkEnv中包含了很多重要的模块, 比如BlockManager, 所以SparkEnv很重要 Driver端, 在SparkContext初始化的时候 ...

  5. Python 之RabbitMQ使用

    1. IO 多路复用 # select 模拟socket server # server 端 import select import socket import sys import queue s ...

  6. MyBatis3用户指南

    1. 范围和生命周期     SqlSessionFactoryBuilder -->SqlSessionFactory-->SqlSession-->Mapper 实例 SqlSe ...

  7. Linux常见错误之Could not get lock /var/lib/dpkg/lock - open

    在Ubuntu系统上安装vim是遇到的问题: root@ubuntu:/# vim The program 'vim' can be found in the following packages: ...

  8. mysql数据库从删库到跑路之mysql表操作

    表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 ...

  9. 字典的fromkeys的用法

    fromkeys方法语法 dict.fromkeys(iterable[,value=None]) iterable 用于创建新的字典的键的可迭代对象(字符串,列表,元组,字典) value 可选参数 ...

  10. PHP的pm、pm.max_requests、memory_limit

    1.php-fpm.conf中的pm pm是来控制php-fpm的工作进程数到底是一次性产生固定不变(static)还是在运行过程中随着需要动态变化(dynamic).众所周知,工作 进程数与服务器性 ...