Java中可以实现的定时任务策略

Java中可以实现的定时任务策略

文章目录

  • Java中可以实现的定时任务策略
    • 自定义独立线程
    • JDK提供的调度线程池-**ScheduledExecutorService**
    • 内核是Spring的Task执行调度
    • quartz调度

定时任务的实现
自定义独立线程
JDK提供的调度线程池
Spring中的调度
Quartz

自定义独立线程

package com.example.demo;import java.util.concurrent.atomic.AtomicBoolean;public class SimpleTask {private final AtomicBoolean started = new AtomicBoolean(false);Thread scheduledThread = new Thread(this::doSchedule, "SimpleTask");private void doSchedule() {while (started.get()) {System.out.println(Thread.currentThread().getName() + ":哒哒哒...");}}private void stop() throws InterruptedException {if (!started.get()) {throw new IllegalStateException(scheduledThread.getName() + "未启动!");}if (started.compareAndSet(true, false)) {System.out.println(scheduledThread.getName() + ":关闭");}if (Thread.currentThread() != scheduledThread) {scheduledThread.join();}}public static void main(String[] args) throws InterruptedException {SimpleTask s = new SimpleTask();if (s.started.compareAndSet(false, true)) {s.scheduledThread.start();}System.out.println(Thread.currentThread().getName() + ":" + s.started.get());Thread.sleep(200);s.stop();System.out.println(Thread.currentThread().getName() + ":" + s.started.get());}}

结果

main:true
SimpleTask:哒哒哒...
SimpleTask:哒哒哒...
SimpleTask:哒哒哒...
SimpleTask:哒哒哒...
SimpleTask:关闭
main:false

JDK提供的调度线程池-ScheduledExecutorService

package com.example.demo;import com.google.common.util.concurrent.ThreadFactoryBuilder;import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduledExecutorTask {public static void main(String[] args) throws InterruptedException {ScheduledExecutorService service = Executors.newScheduledThreadPool(1, new ThreadFactoryBuilder().setNameFormat("ScheduledThreadPool-%d").build());service.scheduleAtFixedRate(() -> System.out.println(Thread.currentThread().getName() + ":哒哒哒..哒..哒哒..哒..."), 1, 1, TimeUnit.SECONDS);Thread.sleep(6000);service.shutdown();}
}
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...
ScheduledThreadPool-0:哒哒哒..哒..哒哒.哒...

内核是Spring的Task执行调度

内核是Spring的Task执行调度说明:https://docs.spring.io/spring-framework/reference/integration/scheduling.html

以SpringBoot为例

开启调度

使用@EnableScheduling配置启动类,开启任务调度

@SpringBootApplication
@EnableScheduling
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

开发调度任务

package com.example.demo;import java.text.SimpleDateFormat;
import java.util.Date;import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;@Component
public class ScheduledTasks {private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");// 简单的时间间隔执行@Scheduled(fixedRate = 5000)public void reportCurrentTime() {log.info("The time is now {}", dateFormat.format(new Date()));}//使用cron表达式进行调度周期控制@Scheduled(cron = "0/5 * * * * ?")public void cron() {log.info("{}", "哒哒哒...");}
}

quartz调度

以SpringBoot为例集成quartz

<!-- 任务调度quartz-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

开发任务

实现quartz的Job接口

package com.example.demo;import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;import javax.annotation.Resource;
import java.util.List;@Slf4j
public class SampleJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {log.info("SampleJob is execute");}
}

Quartz任务注册

	@Resourceprivate Scheduler scheduler;
 try {String groupName = "group-"+SampleJob.class.getName();String name = SampleJob.class.getName();// 构建触发器的KeyTriggerKey triggerKey = TriggerKey.triggerKey(name, groupName);Trigger trigger = scheduler.getTrigger(triggerKey);if (null == trigger) {// 创建任务(Job的实现类)JobDetail jobDetail = JobBuilder.newJob(SampleJob.class).withIdentity(name, groupName).build();// 使用Cron表达式定义触发规则CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/30 * * * ?").withMisfireHandlingInstructionFireAndProceed();// 创建触发器trigger = TriggerBuilder.newTrigger().withIdentity(name, groupName).withSchedule(scheduleBuilder).build();// 将触发器和任务绑定到调度器内scheduler.scheduleJob(jobDetail, trigger);LOG.info("Quartz 创建了job: {}", jobDetail.getKey());} else {LOG.info("job: {} 已存在", trigger.getKey());}} catch (Exception e) {LOG.error("quartz异常:{},{}", e.getMessage(), e);}

Quartz 支持集群模式(分布式任务的调度),持久化方式是 JDBC,将数据持久化到数据库。

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

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

相关文章

个人项目介绍4:三维园区篇

个人项目介绍: 地图铁路线路篇 地球卫星篇 火车站篇 三维园区篇 项目需求&#xff1a; 1.按比例全景显示三维园区 2.精确显示园区内设备设施 3.实时显示设备报警信息 4.显示园区内摄像监控设备&#xff0c;并可点击显示监控视频流 5.显示园区内的重大危险源和风险分布 …

ASPICE SYS3架构设计文档编写规范

一、文档目的与范围 本规范旨在指导新能源汽车电池管理系统(BMS)的开发团队按照ASPICE (Automotive SPICE) 的SYS3级别要求来编写详细的系统架构设计文档。文档应涵盖从概念设计到具体实现的所有关键系统架构决策和设计细节,确保系统的可追溯性、完整性及一致性。 二、文…

PCL 路面点云标线提取(C++详细过程版)

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 算法来自本人自创。实现效果如下图所示,具体实现原理看代码即可。 二、代码实现 #include

bean的管理方式

默认情况下&#xff0c;spring项目启动时&#xff0c;会把bean对象全部创建好放到ioc容器 主动获取bean对象&#xff1a;getBean里面传入bean的名称或bean的类型 注意如果没有主动设置bean的名称&#xff0c;则默认名称是对应类名的首字母小写 在ioc容器中&#xff0c;bean对…

Django 视图

请求对象: HttpRequest 对象 get()&#xff1a;返回字符串&#xff0c;如果该键对应有多个值&#xff0c;取出该键的最后一个值。 GET&#xff1a;有相同的键&#xff0c;就把所有的值放到对应的列表里 取值格式&#xff1a;对象.方法。 def runoob(request): name re…

今天分享一个好看的输入法皮肤相信每个人心里住着一个少女心我们美化一下她吧

标题&#xff1a; 白日梦皮肤上线&#xff0c;百度输入法助你开启梦幻之旅&#xff01; 正文&#xff1a; 大家好呀&#xff01;今天我来给大家安利一款超级梦幻的百度输入法皮肤——“白日梦”系列&#xff01; 这款皮肤的设计灵感来源于我们内心深处的白日梦&#xff0c;充…

14. C++继承与虚函数

【继承基础概念】 继承可以让本类使用另一个类的非私有成员&#xff0c;提供共用成员的类称为父类或基类&#xff0c;使用共用成员的类称为子类或派生类&#xff0c;子类创建对象时会包含继承自父类的成员。 继承的优势是减少重复定义数据&#xff0c;当本类需要在另一个类的…

【设计模式】工厂模式与抽象工厂模式

工厂方法 以图书馆管理系统为例&#xff0c;需要API提供查询不同专业分类的书目列表&#xff0c;一般实现&#xff0c; class LibraryManager { public:LibraryManager() {}//按专业分类查询BookList Query(Type type) {if(type TA) {return ...;} else if (type TB) {} el…

L1-009 N个数求和

MD...提交过了好几次才通过。 第三个测试点: 需要使用long long&#xff0c;要求长整型。干脆就把int全部替换成long long。 第五个测试点: 随便试出来的&#xff0c;我输入了2 1/2 -1/2,发现啥都没打印出来。原来是忽略了结果是0的情况&#xff0c;如果整数部分和分子部分都…

LabVIEW高温摩擦磨损测试系统

LabVIEW高温摩擦磨损测试系统 介绍了一个基于LabVIEW的高温摩擦磨损测试系统的软件开发项目。该系统实现高温条件下材料摩擦磨损特性的自动化测试&#xff0c;通过精确控制和数据采集&#xff0c;为材料性能研究提供重要数据支持。 项目背景 随着材料科学的发展&#xff0c;…

git revert 撤回之前的几个指定的提交

文章目录 Intro操作命令-n 选项 参考 Intro 在开发过程中&#xff0c;有的时候一开始只是一个小需求&#xff0c;可以改着改着事情超出了控制&#xff0c;比如说我一开始只是想调整一个依赖包的版本&#xff0c;可是改到后来类库不兼容甚至导致项目无法启动。 这个时候我就想&…

npm市场发布包步骤

1.打开npm官网npm官网 2.创建自己的账号 3.查看当前npm的镜像源&#xff0c; 如果出现淘宝的镜像源则需要切换成官方的镜像源 npm config get registry //查看镜像源 https://registry.npm.taobao.org/ //淘宝的镜像源 https://registry.npmjs.org/ //官方的镜像源 …

GB/T 35752-2017 经编复合土工织物检测

经编复合土工织物是指以玻璃纤维纱或合成纤维长丝为主要原料&#xff0c;通过双轴向经编与非织造布缝编而成的经编复合土工布。 GB/T 35752-2017 经编复合土工织物测试项目&#xff1a; 测试要求 测试标准 纵向和横向标称断裂强度 GB/T 21825 GB/T 15788 单位面积质量偏差…

Linux文本处理三剑客:awk(常用匹配模式)

在Linux操作系统中&#xff0c;grep、sed、awk被称为文本操作“三剑客”&#xff0c;上三期中&#xff0c;我们将详细介绍grep、sed、awk的基本使用方法&#xff0c;希望能够帮助到有需要的朋友。 1、前言 awk作为一门编程语言还有很多内容&#xff0c;我们继续学习awk。 网…

线程安全之死锁

目录 一、概念 二、例子 三、死锁相关面试题目 一、概念 死锁主要发生在有多个依赖锁存在时,会在一个线程试图以另一个线程相反顺序锁住互斥量时发生 死锁使得一个或多个线程被挂起而无法继续执行,最糟糕的是,这种情况还不容易被发现。 在一个线程中对一个已经加锁的普通锁…

【每日一题】2575. 找出字符串的可整除数组-2024.3.7

题目: 2575. 找出字符串的可整除数组 给你一个下标从 0 开始的字符串 word ,长度为 n ,由从 0 到 9 的数字组成。另给你一个正整数 m 。 word 的 可整除数组 div 是一个长度为 n 的整数数组,并满足: 如果 word[0,...,i] 所表示的 数值 能被 m 整除,div[i] = 1否则,d…

根据标准化开发流程---解析LIN总线脉冲唤醒的测试方法和用例设计思路

前言&#xff1a;本文从标准化开发流程的角度&#xff0c;以LIN总线脉冲唤醒为切入点。从测试工程师的角度来讲测试工作应当如何展开&#xff08;结合我干测试总结出来的测试经验&#xff09;。希望大家都能从中有收获&#xff01;&#xff01;谢谢&#xff01;&#xff01; 1…

FreeROTS day2

总结DMA空闲中断接收数据的使用方法 首先要要选择串口然后配置串口的参数&#xff0c;配置MDA通道选择接受数据&#xff0c;配置空闲中断&#xff0c;定义一个数据接收的容器&#xff0c;启动MDA传输当串口收到数据时MDA将数据传输到容器中,MDA会一直检测是否有数据当有数据并…

SonarQube代码检查,java代码优化(Bug类型)

文章目录 一、bug类型1、运算类型优化将此乘法运算的一个操作数强制转换为“long”将此除法运算的一个操作数强制转换为“double”通过将“&0xff”添加到此表达式来阻止“int”提升更正运算符“||”两侧的一个相同子表达式 2、变量类型优化删除“字节”的装箱移除"Dou…

Android JNI 普通方法和静态方法详解

Android JNI 普通方法和静态方法详解 文章目录 Android JNI 普通方法和静态方法详解一、前言二、Android JNI 普通方法和静态方法1、native 的静态方法和普通方法&#xff08;1&#xff09; JNI定义nativie普通方法和静态方法&#xff08;2&#xff09;jni native-lib.cpp中的代…