五种定时任务方案(Timer+ScheduleExecutorService+spring task+多线程执行+quartz)

方案一:Timer

(1)Timer.schedule(TimerTask task,Date time)安排在制定的时间执行指定的任务。

(2)Timer.schedule(TimerTask task,Date firstTime ,long period)安排指定的任务在指定的时间开始进行重复的固定延迟执行.

(3)Timer.schedule(TimerTask task,long delay)安排在指定延迟后执行指定的任务.

(4)Timer.schedule(TimerTask task,long delay,long period)安排指定的任务从指定的延迟后开始进行重复的固定延迟执行.

(5)Timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period)安排指定的任务在指定的时间开始进行重复的固定速率执行.

(6)Timer.scheduleAtFixedRate(TimerTask task,long delay,long period)安排指定的任务在指定的延迟后开始进行重复的固定速率执行.

public class TestTimer{public static void main(String[] args){TimerTask timerTask = new TimerTask(){@Overridepublic void run(){System.out.println("tesk run:" + new Date());}};Timer timer = new Timer();//安排指定的任务在指定的时间开始进行重复的而固定延迟执行,每3庙执行一次timer.schedule(timeTask,10,3000);}
}

在这里插入图片描述
在这里插入图片描述

方案二:ScheduleExecutorService

public class TestScheduleExecutorService{public static void main(String[] args){ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();/**参数:任务体、首次执行的延时时间、任务执行间隔、间隔时间单位*/service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()),0, 3, TimeUnit.SECONDS);}
}

在这里插入图片描述
在这里插入图片描述

方案三:SpringTask

Cron表达式:若干数字、空格、符号按照一定的规则组成一组字符串来表达时间信息。在线corn表达式生成器:https://www.pppet.net/

标准格式:A B C D E F G
A表示秒;B表示分;C表示小时;D表示日;E表示月;F表示星期;G表示年
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

spring3.0以后自带的task

注解方式:

<!--启动定时任务的注解驱动--><task:annotation-driven/>
@Slf4j
@Component
public class ScheduledService{@Scheduled(cron = "0/5 * * * * *")public void scheduled(){log.info("====>使用cron {}",System.currentTimeMillis());}@Scheduled(fixedRate = 5000) //每5秒运行一次public void scheduled1(){log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());}@Scheduled(fixedDelay = 5000)public void scheduled2() {log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());}
}

在这里插入图片描述

配置方式:

 <!--配置定时任务--><task:scheduled-tasks><!--<task:scheduled ref="job1" method="run" cron="0/5 * * * * ?"/>--><task:scheduled ref="job1" method="run" fixed-rate="5000"/></task:scheduled-tasks>

每5秒执行一次

public class job1 {public void run(){System.out.println("job1....."+new Date());}
}

方案四:多线程执行

基于注解设置多线程

@Component
@EnableScheduling //开启定时任务
@EnableAsync //开启多线程
public class MultithreadScheduleTask{@Async@Scheduled(fixedDDelay = 5000) //间隔5秒public void first(){System.out.println("第一个定时任务开始:" + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());System.out.println();Thread.sleep(1000 * 10);}@Async@Scheduled(fixedDelay = 5000)public void second() {System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());System.out.println();}
}

在这里插入图片描述

方案五:quartz

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
@Configuration
public class QuartzConfig{@Beanpublic JobDetail teatQuaritzDetail(){return JobBuilder.newJob(MyAuartz.class).withIdentity("myQuartz").storeDurably().build();}@Beanpublic Trigger testQuartzTrigger(){SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10) //设置时间周期单位.repeatForever();return TriggerBuilder.newTrigger().forJob(testQuartzDetail()).withIdentity("testQuartz").withSchedule(scheduleBuilder).build();}
}

只要启动SpringBoot羡慕就会输出:
在这里插入图片描述

配置的方式:

  <dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.3.2</version></dependency>
	<!-- 线程池 --><bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize" value="10" /><property name="maxPoolSize" value="100" /><property name="queueCapacity" value="500" /></bean><!--FixedRate 定时任务 --><bean id="quartzJob" class="com.wanmait.mavendemo.job.QuartzJob" /><bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="quartzJob" /><property name="targetMethod" value="print" /></bean><!-- Cron   quartz-2.x 的配置  时间调度的两种写法 fixedRate和cron--><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" ><property name="jobDetail" ref="jobDetail" /><property name="cronExpression" value="0/5 * * * * ?" /></bean><bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"><property name="jobDetail" ref="jobDetail"></property><property name="startDelay" value="0" /><!-- 调度工厂实例化后,经过 0 秒 开始执行调度 --><property name="repeatInterval" value="2000" /><!-- 每 2 秒调度一次 --></bean><!-- 调度 看你用哪个 两种选一种   --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="triggers"><list><!--<ref bean="simpleTrigger" />--><ref bean="cronTrigger"/></list></property><property name="taskExecutor" ref="executor" /></bean>
public class QuartzJob{public void print(){System.out.println("quartzjob.........."+new Date());}
}

SpringBoot定时任务:
在启动类上加@EnableScheduling开启定时任务
写一个任务类添加@Component注解被spring管理,在方法上添加@Scheduled(fixedRate = 2000)或者 @Scheduled(cron = “0-5 * * ? * *”)

动态调整定时任务执行corn表达式、动态关闭开启定时任务

@Configuration
public class ScheduledConfig implements SchedulingConfigurer{@Autowiredprivate ApplicationContext context;@Overridepublic void confugureTasks(ScheduledTaskRegistrar taskRegistrar){for(SpringScheuledCron springScheduledCron:cronRepository.findAll()){Class<?> clazz;Object task;try{clazz = Class.forName(springScheduledCron.getCronKey());task = context.getBean(clazz);}catch(ClassNotFoundException e){throw new IllegalArgumentException("spring_scheduled_cron表数据" + springScheduledCron.getCronKey() + "有误", e);}catch(BeansException e){throw new IllegalArgumentException(springScheduledCron.getCronKey() + "未纳入到spring管理", e);}Assert.isAssignable(ScheduledOfTask.class, task.getClass(), "定时任务类必须实现ScheduledOfTask接口");//可以通过改变书库数据进而实现动态改变执行周期taskRegistrar.addTriggerTask(((Runnable)task),triggerContext -> {//可以使用持久层,比如Mybatis来实现,从数据库中获取String cronExpression = "0/10 * * * * ?";return new CronTrigger(cronExpression).nextExecutionTime(triggerContext);});}}@Beanpublic Executor taskExecutor(){return Executors.newScheduledThreadPool(10);}
}

分布式调度框架

分布式任务调度框架有:cronsun、Elastic-job、saturn、lts、TBSchedule、xxl-job 等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/70546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YashanDB:潜心实干,数据库核心技术突破没有捷径可走

都说数据库是三大基础软件中的一块硬骨头&#xff0c;技术门槛高、研发周期长、工程要求高&#xff0c;市场长期被几大巨头所把持。 因此&#xff0c;实现突破一直是中国数据库产业的夙愿。自上个世纪80年代起&#xff0c;中国数据库产业走过艰辛坎坷的四十余载&#xff0c;终…

【数据结构】二叉搜索树——二叉搜索树的概念和介绍、二叉搜索树的简单实现、二叉搜索树的增删查改

文章目录 二叉搜索树1. 二叉搜索树的概念和介绍2. 二叉搜索树的简单实现2.1二叉搜索树的插入2.2二叉搜索树的查找2.3二叉搜索树的遍历2.4二叉搜索树的删除2.5完整代码和测试 二叉搜索树 1. 二叉搜索树的概念和介绍 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&…

【Spring 事务和事务传播机制】

目录 1 事务概述 1.1 为什么需要事务 1.2 事务的特性 1.3 Spring 中事务的实现 2 Spring 声明式事务 2.1 Transactional 2.2 Transactional 的作用范围 2.3 Transactional 的各种参数 2.3.1 ioslation 2.4 事务发生了异常&#xff0c;也不回滚的情况 异常被捕获时 3 事务的传…

oracle数据库给用户授权DBA权限Oracle查看哪些用户具有DBA权限

oracle数据库给用户授权DBA权限 步骤一&#xff1a;以sysdba身份登录到Oracle数据库 在授予DBA权限之前&#xff0c;我们首先要以sysdba身份登录到Oracle数据库。使用以下命令登录&#xff1a; sqlplus / as sysdba步骤二&#xff1a;创建用户&#xff08;如有用户跳过&#…

通过 Blob 对二进制流文件下载实现文件保存下载

原理&#xff1a;前端将二进制文件做转换实现下载: 请求后端接口->接收后端返回的二进制流(通过二进制流&#xff08;Blob&#xff09;下载,把后端返回的二进制文件放在 Blob 里面)->再通过file-saver插件保存 页面上使用&#xff1a; <span click"downloadFil…

Linux: memory: memblock: debug

文章目录 代码memblock=debug实例log代码 将内存相关的一些日志打开: static int __init early_memblock(char *p) {if (p && strstr(p, "debug")

如何使用API数据接口给自己创造收益

使用API数据接口创造收益的方法有很多&#xff0c;以下是一些常见的方法&#xff0c;并附有代码示例&#xff1a; 一、数据分析与预测 通过获取API数据接口中的大量数据&#xff0c;我们可以进行深入的数据分析&#xff0c;并利用这些数据来预测未来的趋势和行为。例如&#…

作为产品经理,有必要考PMP或者NPDP么?

产品经理的核心竞争力是什么? 三点&#xff1a;知识、能力和决策 懂得越多&#xff0c;能力越强&#xff0c;决策越正确&#xff0c;核心竞争力越强。一般来说&#xff0c;看的越多&#xff0c;做的越多&#xff0c;实践出经验才是王道&#xff0c;但是&#xff0c;总有看不…

智慧物流发展的重要推动力量:北斗卫星导航系统

随着经济的快速发展和电商的普及&#xff0c;物流行业的规模不断扩大&#xff0c;对物流运输的效率和安全性也提出了更高的要求。传统的物流运输方式存在着效率低下、信息不对称、安全隐患等问题&#xff0c;因此发展智慧物流已经成为物流行业的必然趋势。智慧物流可以通过先进…

力扣(LeetCode)算法_C++—— 存在重复元素

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,1] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;nums …

立晶半导体Cubic Lattice Inc 专攻音频ADC,音频DAC,音频CODEC,音频CLASS D等CL7016

概述&#xff1a; CL7016是一款高保真USB Type-C兼容音频编解码芯片。可以录制和回放有24比特音乐和声音。内置回放通路信号动态压缩&#xff0c; 最大42db录音通路增益&#xff0c;PDM数字麦克风&#xff0c;和立体声无需电容耳机驱动放大器。 5V单电源供电。兼容USB 2.0全速工…

深度学习面试八股文(2023.9.06持续更新)

一、优化器 1、SGD是什么&#xff1f; 批梯度下降&#xff08;Batch gradient descent&#xff09;&#xff1a;遍历全部数据集算一次损失函数&#xff0c;计算量开销大&#xff0c;计算速度慢&#xff0c;不支持在线学习。随机梯度下降&#xff08;Stochastic gradient desc…

C++内存分区

一、C程序执行时&#xff0c;将内存大方向划分为4个区域 代码区&#xff1a;存放函数体的二进制代码&#xff0c;由操做系统进行管理&#xff1b;全局区&#xff1a;存放全局变量和静态变量以及常量&#xff1b;栈区:由编译器自动分配释放&#xff0c;存放函数的参数值、局部变…

基于vue-cli创建后台管理系统前端页面——element-ui,axios,跨域配置,布局初步,导航栏

目录 引出安装npm install安装element-ui安装axios 进行配置main.js中引入添加jwt前端跨域配置 进行初始布局HomeView.vueApp.vue 新增页面和引入home页面导航栏总结 引出 1.vue-cli创建前端工程&#xff0c;安装element-ui&#xff0c;axios和配置&#xff1b; 2.前端跨域的配…

记录学习--字节码解析try catch

1.示例代码 Testpublic void someTest() {String s "111";try {s "222";int i 1/0;} catch (Exception e){e.printStackTrace();System.out.println(s);}System.out.println(s);}2.示例代码对应的字节码 0 ldc #2 <111>2 astore_13 ldc #3 <22…

“深入理解SpringMVC的注解驱动开发“

目录 引言1. SpringMVC的常用注解2. SpringMVC的参数传递3. SpringMVC的返回值4. SpringMVC页面跳转总结 引言 在现代的Web开发中&#xff0c;SpringMVC已经成为了一个非常流行和强大的框架。它提供了许多注解来简化开发过程&#xff0c;使得我们能够更加专注于业务逻辑的实现…

【网络编程】网络基础概念

(꒪ꇴ꒪ )&#xff0c;Hello我是祐言QAQ我的博客主页&#xff1a;C/C语言&#xff0c;数据结构&#xff0c;Linux基础&#xff0c;ARM开发板&#xff0c;网络编程等领域UP&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff0c;让我们成为一个强大的攻城狮&#xff0…

【python】TCP socket服务器 Demo

目录 一、单线程服务器 二、多线程服务器 三、多线程服务器&#xff08;发送和接收分离&#xff09; 一、单线程服务器 说明&#xff1a;只能连接一个客户端 import socket,binascii# 创建一个 TCP 套接字 server_socket socket.socket(socket.AF_INET, socket.SOCK_STRE…

智能网联汽车电子电气架构

关键核心技术名称&#xff1a; 智能网联汽车电子电气架构 必要性和国内外技术成熟性简介 随着汽车智能化、网联化的发展趋势&#xff0c;车辆的电子化程度逐渐提高&#xff0c;车载传感器和控制器的数量越来越多&#xff0c;要求必须开发满足智能网联汽车新需求的新一代电子…

计算机组成原理知识——CPU结构组成和功能、堆栈、RISC、

文章目录 前言一、CPU组成二、指令执行步骤1、取指Instruction Fetch/IF2、译码Instruction decode/ID3、访存Memory/MEM4、执行Execute/EX5、写回Writeback/WB 三、冯诺依曼结构和哈佛结构四、数据结构中的堆栈 VS 程序内存中的堆区和栈区1、数据结构的堆栈2、C语言程序的内存…