首页 > 其他分享 >Spring Task详细使用

Spring Task详细使用

时间:2024-08-06 22:28:51浏览次数:10  
标签:Task Spring 任务 线程 详细 定时 执行

一、定时任务的理解

定时任务即系统在特定时间执行一段代码,它的场景应用非常广泛:

  • 购买游戏的月卡会员后,系统每天给会员发放游戏资源。
  • 管理系统定时生成报表。
  • 定时清理系统垃圾。

定时任务的实现主要有以下几种方式:

1、Java自带的java.util.Timer类,这个类允许调度一个java.util.TimerTask任务。使用这种方式可以让程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。
2、Quartz。这是一个功能比较强大的的调度器,可以让程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。
3、Spring3.0以后自带Spring Task,可以将它看成一个轻量级的Quartz,使用起来比 Quartz简单许多,在课程中我们使用Spring Task实现定时任务

二、入门案例

创建SpringBoot项目,在启动类开启定时任务。

也就是在启动类上方添加@EnableScheduling注解即可开启定时任务,代码如下:

编写定时任务类 

启动项目,定时任务方法按照配置定时执行。 

OK,果然如此,每隔2秒输出当前时间

@Scheduled写在方法上方,指定该方法定时执行。常用参数如下:

  1. cron:cron表达式,定义方法执行的时间规则。
  2. fixedDelay:任务立即执行,之后每隔多久执行一次,单位是毫秒,上一次任务结束后计算下次执行的时间。

OK,先来一个案例,代码如下:任务结束后每隔五秒执行一次

效果如下: 

OK,果然如此,注意这个是任务结束后每隔五秒

initialDelay:项目启动后不马上执行定时器,根据initialDelay的值延时执行。 这里配合fixedDelay来结合测试演示一下:

OK,看运行结果也是隔了三秒才出现第一次打印时间,并且打印时间是隔六秒打印一次

三、多线程案例

Spring Task定时器默认是单线程的,如果项目中使用多个定时器,使用一个线程会造成效率低下。

比如说我们设置了两个定时任务,那么因为Spring Task是单线程,如果在第一个定时任务加了一个sleep方法,那么会等第一个方法响应后在执行第二个任务,就很浪费cpu运行时间。代码如下:

@Scheduled(cron = "* * * * * *")
    public void task3() throws InterruptedException {
        System.out.println(Thread.currentThread().getId()+"线程执行任务1 - "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
        Thread.sleep(5000);
    }

    @Scheduled(cron = "* * * * * *")
    public void task4() throws InterruptedException {
        System.out.println(Thread.currentThread().getId()+"线程执行任务2 - "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }

执行效果如下:可以看到是先执行了任务2,但是他们都要隔五秒才能运行一次,因为通过线程号可以知道这是同一个线程。

因此任务1较浪费时间,会阻塞任务2的运行。此时我们可以给SpringTask配置线程池。代码如下:

@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        // 创建线程池,设置五个线程
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(4));
    }
}

这样就不会出现阻塞问题了,因为两个任务不是同一个线程,接下来我们再次运行看看:

执行效果如上,确实不会影响到任务2的运行,但是如果定时任务过多,超过了配置的线程池的线程数量还是会运行错乱。

标签:Task,Spring,任务,线程,详细,定时,执行
From: https://blog.csdn.net/weixin_52496592/article/details/140966504

相关文章

  • Spring Boot(八十五):集成Apache PDFBox对pdf文件进行操作
    1 ApachePDFBox简介ApachePDFBox是一个强大的Java库,它可以用来读取、修改和创建PDF文件。在本教程中,我们将介绍如何在SpringBoot项目中集成PDFBox来实现PDF文件的读取与导出功能。官网地址:ApachePDFBox|AJavaPDFLibrary2代码示例创建一个springboot项目。2.1......
  • 【rz & rb & rz】Centos/Linux rz、rb、rz命令详细介绍
    【rz&rb&rz】Centos/Linuxrz、rb、rz命令详细介绍简介基础语法选项介绍基本用法安全事项环境变量注意事项简介        系统版本:Centos7.6        rz、rb、rz命令属于lrzsz程序的内容,是使用纠错协议通过拨号串行端口从在PC-DOS、CP/M、Unix和......
  • rqt的安装及详细介绍
    1.安装安装极其简单,不多介绍,直接上命令:Melodic: sudoapt-getinstallros-melodic-rqtsudoapt-getinstallros-melodic-rqt-common-pluginsNoetic sudoapt-getinstallros-noetic-rqtsudoapt-getinstallros-noetic-rqt-common-plugins2.部分工具的功能介......
  • basic_pentesting_2靶场实战【超详细】
    下载链接:https://download.vulnhub.com/basicpentesting/basic_pentesting_2.tar.gz一、靶场配置网卡配置为nat二、主机探测与端口扫描nmap192.168.121.0/24 开放了22、80、31337端口nmap192.168.121.188-p--A-sV-Pn 访问80web服务 提示跟随白色兔子f12......
  • Spring DI
    目录一、主要概念1.依赖2.控制反转(IoC)3.注入方式4.Spring容器二、优点三、示例SpringDI(DependencyInjection,依赖注入)是一种设计模式,用于实现控制反转(InversionofControl,IoC)。在Spring框架中,DI是核心特性之一,通过将对象的创建和管理从应用程序代码中抽离出......
  • 【iOS】KVO详细总结
    KVO0.怎么复习?知道KVO怎么用,KVO三部曲缺一不可KVO分为对单一属性的监听,和对集合里面内容的监听。然后单一属性的监听分为自动触发和手动触发,集合对象的监听也分为自动触发和手动触发KVO的使用注意,防crash。正确顺序:1⃣️context强引用2⃣️removeObserver移除观察者3⃣️释放obs......
  • 什么是大模型?大模型入门指南(非常详细)从入门到精通,看这一篇就够了
    伴随着这段时间,人工智能,AI的热门,“大模型”一词也经常出现在我们的视野中。对于普通人来说,GPT,人工智能,AI,大模型,这些每个字都看得懂但是连起来却觉得理解不完全。今天我们就来讲讲大模型以及GPT。什么是大模型?我们在生活中常常使用过很多模型,比如自制雪糕的雪糕模具,蛋糕店......
  • 大模型入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
    人人都看得懂的大模型简介大模型就像一座庞大的图书馆,里面有非常多的书籍。但与普通图书馆不同的是,这座图书馆中的每本书都是关于不同事物的描述和知识。而这些书籍中的每一页都代表了这个事物的一些特征或细节。现在,想象一下,你是一个研究员,你想了解各种各样的话题,比如天气......
  • 数仓建模。传统三范式建模和维度建模 详细篇
    数据仓库建模,说白了就是建库建表目录一,三范式建模一,三范式建模的概叙二,三范式建模的作用三,三范式建模的定义四,三范式建模的举例二,维度建模的概念与定义一,维度建模的优势二,维度建模的分类三,维度建模的举例四,维度建模的具体示例:三,三范式建模和维度建模的......
  • 对于springboot无法连接redis解决方案
    对于springboot无法连接redis解决方案一、测试是否能在本地应用上访问到你的redis(如果是部署在linux上的话)1.开启telnet功能2.开始测试端口是否能访问到(适用于所有,包括MQ)3.开放6379端口4.看spring的配置文件注意redis的缩进位置5.pom依赖一、测试是否能在本地......