主要想弄清使用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数据库(绿色版)

    目录 绿色版下载 mysql绿色版(5.7版本的安装与配置) 绿色版下载: mysql官网下载地址:https://www.oracle.com/index.html mysql绿色版(5.7版本的安 ...

  2. HDU_5514_Frogs

    Frogs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...

  3. Pulsar

    The Apache Software Foundation Announces Apache® Pulsar™ as a Top-Level Project : The Apache Softwar ...

  4. The Model represents your data structures.

    w模型代表数据结构. https://www.codeigniter.com/userguide3/overview/mvc.html http://codeigniter.org.cn/user_g ...

  5. 荣誉墙项目day26 django 项目路由配置

    项目路由配置文件包括:配置目录里的urls.py文件和各个app目录里的urls.py文件 1.include()——从项目主路由分配到各APP主路由 from django.conf.urls im ...

  6. rest_framework 之分页器

    一  分页器--准备 1.1  基本参数 # 普通分页 from rest_framework.pagination import PageNumberPagination # 偏移分页 from r ...

  7. 【云安全与同态加密_调研分析(4)】云计算安全领域主要研究成果——By Me

    下表列举了在云安全问题研究表现突出的ICT公司和研究机构以及其在云计算安全方面主要研究成果: ◆ICT公司和研究机构(云计算安全领域主要研究成果)◆ ◆机构名称◆ ◆机构类别◆ ◆主要研究成果◆ ◆备 ...

  8. Java利用BufferedWriter写文本文件

    在本地写入保存的操作, 很多时候我们习惯使用Outputstream, 而其实写文本文件的时候, Java提供一个很好的工具给我们 ----- writer. 由于它是针对文本类型的文件操作, 所以如 ...

  9. python学习笔记(九)函数返回多个值,列表生成式,循环多个变量,入参格式声明

    一.函数返回多个值 1.函数如果返回多个值的话,它会把这几个值放到一个元组里面2.函数如果返回多个值的话,也可以用多个变量来接收 def say(): num1 = num2 = num3 = ret ...

  10. linux去掉文件行尾的^M

    在Linux下使用vi来查看一些在Windows下创建的文本文件,有时会发现在行尾有一些“^M”.这种文件在执行时会报错bash: ./startserver.sh: /bin/sh^M: bad i ...