springBoot @Scheduled实现多个任务同时开始执行

目录
  • @Scheduled多个任务同时开始执行
    • 只需在springBoot启动类上添加
  • @Scheduled多定时任务,重叠执行
    • @Scheduled如果有两个定时任务
    • 如果想要多个定时任务重叠执行

@Scheduled多个任务同时开始执行

只需在springBoot启动类上添加

如下代码即可:

	@Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTaskScheduler();
        taskExecutor.setPoolSize(50);
        return taskExecutor;
    }

@Scheduled多定时任务,重叠执行

@Scheduled如果有两个定时任务

定时任务重复时,只有一个可以执行。

如下

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class MyScheduled {
    @Scheduled(cron = "0/5 * * * * ?")
    public void execute1(){
        String curName = Thread.currentThread().getName() ;
        System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute1对应的线程名: "+curName);
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void execute2(){
        String curName = Thread.currentThread().getName() ;
        System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

通过执行可以看到,打印线程名称为同一个。即如果不手动指定线程池,则默认启动单线程,进行执行定时任务。

如果想要多个定时任务重叠执行

需要手动指定线程池,如下

import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
@EnableScheduling
public class MyScheduled {

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50);
        return taskScheduler;
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void execute1(){
        String curName = Thread.currentThread().getName() ;
        System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute1对应的线程名: "+curName);
        try {
            Thread.sleep(1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Scheduled(cron = "0/5 * * * * ?")
    public void execute2(){
        String curName = Thread.currentThread().getName() ;
        System.out.println("当前时间:"+LocalDateTime.now()+"  任务execute2对应的线程名: "+curName);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

此时,多个定时任务,是不通的线程执行,同时,定时任务可以重叠执行。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • springboot 定时任务@Scheduled实现解析

    这篇文章主要介绍了springboot 定时任务@Scheduled实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.pom.xml中导入必要的依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version&g

  • 深入剖析springBoot中的@Scheduled执行原理

    目录 springBoot @Scheduled执行原理 一.前言 二.@Scheduled使用方式 三.@Scheduled代码执行原理说明 @Scheduled 的一些坑 springBoot @Scheduled执行原理 一.前言 本文主要介绍Spring Boot中使用定时任务的执行原理. 二.@Scheduled使用方式 定时任务注解为@Scheduled.使用方式举例如下: //定义一个按时间执行的定时任务,在每天16:00执行一次. @Scheduled(cron = "0 0 1

  • SpringBoot项目中使用@Scheduled读取动态参数

    目录 使用@Scheduled读取动态参数 1.基于@Scheduled可配置开发 2.基于代码实现 spring boot Scheduled动态配置 使用@Scheduled读取动态参数 1.基于@Scheduled可配置开发 application.propertites: read.timer.parmas=0 0/1 * * * * 定时类: @Component public class ScheduledService { Logger logger= LoggerFactory.

  • springboot定时任务@Scheduled执行多次的问题

    目录 springboot定时任务@Scheduled执行多次 原因 解决方法 使用 @Scheduled 定时任务突然不执行了 springboot定时任务@Scheduled执行多次 在spring boot开发定时任务时遇到一个很怪异的现象..我进行调试模式,在没有bug的情况下.执行了三 次才停止..如图: 原因 是因为执行时间太短,在CronSequenceGenerator.class的next方法. public Date next(Date date) { Calendar ca

  • SpringBoot执行定时任务@Scheduled的方法

    在做项目时,需要一个定时任务来接收数据存入数据库,后端再写一个接口来提供该该数据的最新的那一条. 数据保持最新:设计字段sign的值(0,1)来设定是否最新 定时任务插入数据:首先进行更新,将所有为1即新数据设置过期,然后插入新数据,设置sign为1.这两个操作是原子操作.通过添加事务来进行控制. Java 定时任务的几种实现方式 基于 java.util.Timer 定时器,实现类似闹钟的定时任务 使用 Quartz.elastic-job.xxl-job 等开源第三方定时任务框架,适合分布式

  • SpringBoot中使用@Scheduled注解创建定时任务的实现

    在项目日常开发过程中,经常需要定时任务来帮我们做一些工作,如清理日志.定时任务的实现方法主要有 Timer.Quartz 以及 elastic-job Timer 实现定时任务 只执行一次的定时任务 Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("2000毫米后执行一次."); } }, 2000); timer.s

  • 聊聊SpringBoot的@Scheduled的并发问题

    目录 SpringBoot @Scheduled的并发 spring @Scheduled 并发执行 SpringBoot @Scheduled的并发 由于SpringBoot自带的@Scheduled是一个阻塞执行的定时任务,所以效率会很慢,就会造成同一个时间段内只有一个定时任务在执行,其余的就会阻塞 现有两个定时任务 @Component("aa") public class aa { @Scheduled(cron = "0 44 17 * * ?") pub

  • 使用springboot时,解决@Scheduled定时器遇到的问题

    目录 @Scheduled定时器遇到的问题 下面说一下@Scheduled 注解的几个参数 一.可以通过配置文件配置进来的 二.不可通过配置文件配置的 (作用相同) 定时任务@Scheduled使用的那些坑 一.使用的那些坑? 1.单线程 2.@Async和@EnableAsync 二.使用多线程 小结一下 @Scheduled定时器遇到的问题 @Scheduled 这个注解确实给我们带了很大的方便,我们只要加上该注解,并且根据需求设置好就可以使用定时任务了. 但是,我们需要注意的是,@Sche

  • springBoot @Scheduled实现多个任务同时开始执行

    目录 @Scheduled多个任务同时开始执行 只需在springBoot启动类上添加 @Scheduled多定时任务,重叠执行 @Scheduled如果有两个定时任务 如果想要多个定时任务重叠执行 @Scheduled多个任务同时开始执行 只需在springBoot启动类上添加 如下代码即可: @Bean public TaskScheduler taskScheduler() { ThreadPoolTaskScheduler taskExecutor = new ThreadPoolTas

  • 解决SpringBoot中的Scheduled单线程执行问题

    目录 问题描述 原因分析: 解决方案: 补充: 问题描述 在一次SpringBoot中使用Scheduled定时任务时,发现某一个任务出现执行占用大量资源,会导致其他任务也执行失败.类似于以下模拟场景,test1定时任务模拟有五秒钟执行时间,这时会同步影响到test2任务的执行,导致test2任务也变成五秒执行一次. @Scheduled(fixedRate = 1000) public void test1() throws InterruptedException { log.info(Th

  • SpringBoot中使用@scheduled定时执行任务的坑

    目录 解决办法 1.将@Scheduled注释的方法内部改成异步执行 2.把Scheduled配置成成多线程执行 要注意什么坑 不绕弯子了,直接说这个坑是啥: SpringBoot使用@scheduled定时执行任务的时候是在一个单线程中,如果有多个任务,其中一个任务执行时间过长,则有可能会导致其他后续任务被阻塞直到该任务执行完成.也就是会造成一些任务无法定时执行的错觉 可以通过如下代码进行测试:     @Scheduled(cron = "0/1 * * * * ? ")    

  • @Scheduled 如何读取动态配置文件

    @Scheduled读取动态配置文件 application.yml配置文件得配置信息 agreeAccTask: # # 每3分钟执行一次,handTime: 0 0/3 * * * ? 每天晚上2点 handTime: 0 0 2 * * ? # 指定几天内: day 1 表示当前天内,2表示二天内,依次类推 # 指定生成目录路劲: dir F:/agreeacc time: 0 0 2 * * ? day: 1 dir: F:/agreeacc3 java后端 * @Description

  • @Scheduled注解不能同时执行多个定时任务的解决方案

    目录 @Scheduled注解不能同时执行多个定时任务 @Scheduled同时执行多个定时任务所导致的并发问题 @Scheduled的执行顺序 @Scheduled同步 控制定时任务的执行顺序 @Scheduled注解不能同时执行多个定时任务 最近在使用定时任务的时候发现,自己写的定时任务没有执行,后来查了上网查了一下,才知道@Scheduled注解的定时任务是单线程的,同一时间段内只能执行一个定时任务,其它定时任务不执行. 需要配置@Scheduled多线程支持,才能实现同一时间段内,执行多

  • spring boot 测试单元修改数据库不成功的解决

    目录 spring boot 测试单元修改数据库不成功 springboot 数据库无法进行更改的情况之一 @test迟迟无响应 现象 原因 解决方法 spring boot 测试单元修改数据库不成功 spring boot 集成data jpa 在test区测试数据库操作的时候,查询正常,但是其他对数据库更改却不能成功,例如存入数据库,会报read-only,这时候需要添加@transactional注解,终于不报错了,但是在存入一次后,却发现数据库并没有数据,这是为什么呢? 再查看log时候

  • Springboot定时任务Scheduled重复执行操作

    今天用scheduled写定时任务的时候发现定时任务一秒重复执行一次,而我的cron表达式为 * 0/2 * * * * . 在源码调试的过程中,发现是我的定时任务执行过程太短导致的. 于是我另外写了个简单的定时任务 @Component public class TestJob { @Scheduled(cron = "* 0/2 * * * *") public void test() { System.out.println("测试开始"); System.o

随机推荐