Schedu,Quartz,Timer 三种定时任务

1. Schedu(基于ScheduledExecutorService的定时任务)

特点:
  1. 基于线程池: ScheduledExecutorService 是基于线程池的定时任务调度器。这使得它能够有效地管理和重用线程,减少了线程创建和销毁的开销。

  2. 可调度多个任务: 一个 ScheduledExecutorService 实例可以同时调度多个任务,每个任务都可以有不同的调度策略。

  3. 支持定时和周期性任务: ScheduledExecutorService 提供了两种主要的调度方法,即 schedule 用于定时执行一次,scheduleAtFixedRate 用于按固定的时间间隔周期性执行任务。

  4. 异常处理: 可以通过捕获任务执行过程中的异常来进行异常处理,确保异常不会导致整个调度器停止工作。

优点:
  1. 简单易用: ScheduledExecutorService 提供了简单而直观的 API,使得定时任务的创建和管理变得相对容易。

  2. 轻量级: 相对于一些复杂的调度框架,ScheduledExecutorService 是一个轻量级的解决方案,适用于简单的定时任务场景。

  3. 线程池管理: 通过使用线程池,ScheduledExecutorService 可以更好地管理线程,避免了频繁创建和销毁线程的开销。

  4. 灵活性: 可以根据实际需求创建单次执行或者周期性执行的定时任务,具有较高的灵活性。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;public class ScheduExample {public static void main(String[] args) {ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);// 创建一个定时任务Runnable task = () -> System.out.println("Schedu 定时任务执行了!");// 定时任务在延迟1秒后开始执行,然后每隔5秒执行一次scheduler.scheduleAtFixedRate(task, 1, 5, TimeUnit.SECONDS);}
}

解释: 在这个例子中,我们使用ScheduledExecutorService创建了一个定时任务。scheduleAtFixedRate方法用于安排定时任务,指定了首次执行的延迟时间和之后每次执行的间隔。这种方式相对简单,适用于很多常见的定时任务场景。

2. Quartz(使用Quartz框架实现的定时任务)

  1. 强大的调度功能: Quartz支持非常灵活的调度功能,可以满足各种调度需求,从简单的定时任务到复杂的日历调度。

  2. 可配置性: Quartz允许通过XML配置文件或Java代码进行灵活的配置,从而使得调度器的行为可以根据实际需求进行定制。

  3. 分布式和集群支持: Quartz提供了集群和分布式调度的支持,可以通过配置实现多个调度器的协同工作,确保任务在多个节点上均匀分布和执行。

  4. 持久性存储: Quartz可以将作业和调度信息存储在数据库中,保证调度信息的持久性,即使在应用程序重启后也能够恢复调度状态。

  5. 支持多种触发器类型: Quartz支持多种触发器类型,包括简单触发器、Cron触发器等,可以根据实际需要选择合适的触发器类型。

  6. 丰富的监听器支持: Quartz提供了丰富的监听器接口,允许开发者监听任务和调度器的各种事件,从而更好地进行任务处理和监控。

  7. 作业的状态和执行记录: Quartz会记录每个作业的执行状态和执行历史,方便进行监控和调试。

  8. 容错和错过触发的处理: Quartz能够处理任务执行中的异常,保证任务执行的稳定性。同时,它还提供了错过触发的处理机制,确保错过的任务在下次调度时能够得到执行。

  9. 开放源代码和活跃社区: 作为开源项目,Quartz拥有庞大的社区支持,用户可以从社区获取丰富的资源和解决方案。

使用Quartz的基本流程:
  1. 定义Job类: 创建一个实现Job接口的类,该类中包含具体的任务逻辑。

  2. 创建Trigger: 创建一个Trigger对象,指定任务的触发条件,例如执行时间、间隔等。

  3. 创建Scheduler: 创建一个Scheduler对象,它是Quartz中的调度器,负责调度Job的执行。

  4. 将Job和Trigger关联到Scheduler: 将Job和Trigger关联到Scheduler中,形成一个调度任务。

  5. 启动Scheduler: 启动Scheduler,使得任务得以执行。

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;public class QuartzExample {public static void main(String[] args) throws SchedulerException {// 创建调度器Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();// 创建一个定时任务JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group1").build();// 创建触发器,每隔5秒执行一次Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();// 将任务和触发器关联到调度器scheduler.scheduleJob(job, trigger);}public static class MyJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {// 执行定时任务的逻辑System.out.println("Quartz定时任务执行了!");}}
}

解释: Quartz是一个强大的定时任务调度框架,这个例子展示了如何使用Quartz创建定时任务和触发器。Quartz支持更复杂的调度需求,并提供了丰富的功能,如任务持久化、集群支持等。

3. Timer(基于Timer和TimerTask的定时任务)

一些限制和注意事项:
  1. 单线程执行: Timer 是单线程的,如果一个任务执行时间过长,会影响其他任务的执行时机。因此,对于需要长时间执行的任务,ScheduledExecutorService 可能是一个更好的选择。

  2. 不处理异常: Timer 对异常的处理相对简单,一旦 TimerTask 中抛出了未捕获的异常,整个定时任务就会终止执行。这可能导致整个 Timer 停止工作。

  3. 精确度受限: Timer 不保证任务的精确执行时间,它受系统时钟的影响。如果系统时间发生变化,可能导致定时任务的执行时间出现偏差。

  4. 不适合长期运行的任务: Timer 不适合长期运行的任务,它适用于重复执行的短期任务。长时间运行的任务可能会导致 Timer 的性能问题。

  5. 定时器取消问题: 在任务中抛出异常时,Timer 会取消所有后续的任务执行。这可能不是期望的行为,特别是在应对错误时希望保持定时器运行的情况下。

import java.util.Timer;
import java.util.TimerTask;public class TimerTaskExample {public static void main(String[] args) {Timer timer = new Timer();// 创建一个定时任务TimerTask task = new TimerTask() {@Overridepublic void run() {// 执行定时任务的逻辑System.out.println("Timer 定时任务执行了!");}};// 定时任务在延迟1秒后开始执行,然后每隔5秒执行一次timer.schedule(task, 1000, 5000);}
}

解释: 这个例子演示了如何使用TimerTimerTask创建定时任务。尽管简单易用,但Timer有一些局限性,例如不能处理异常、不适合长时间运行的任务等。在一些场景下,可能需要考虑使用更强大的调度框架。

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

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

相关文章

CSRF之pikachu靶场DW

1,登录皮卡丘靶场,get请求; 2,抓包并修改标记后的个人信息 最后放通一下,发现账号信息被修改 2,post请求 1提交post数据并使用bp抓包 2.利用工具改包,并生成url 3,点击提交后&#…

SpringBoot自定义异常处理机制

说明:在完整的项目结构中,我们通常会创建一个自定义的异常处理机制,在系统可能出现异常的地方手动抛出这些异常,可以快速定位到异常代码片段,提供项目的可维护性。 本文介绍在SpringBoot项目中,搭建一套自…

ssm党务政务服务热线平台源码和论文答辩PPT

摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数据库设计…

Vue3的watch函数中,第三个参数配置对象详细分析

在Vue 3的watch函数中,第三个参数是一个配置对象,用于定义如何执行watch函数。下面是几个常用的配置项的讲解,并附上代码示例: 1、immediate immediate:当设置为true时,会在初始渲染时立即执行watch函数。…

C++11改进单例模式

单例模式保证一个类仅有一个实例,并提供一个访问它的全局访问点。 C11之前,实现一个通用的泛型单例模式时,会遇到一个问题:这个泛型单例要能够创建所有的类型对象,但是这些类型的构造函数形参可能尽不相同,…

Appium:进行iOS自动化测试遇到的问题与解决方案

问题与解决方案 在使用Appium进行iOS自动化测试时,可能会遇到各种问题。 以下是一些常见的问题及其解决方案: 无法启动inspector问题 最新版本的Appium已经将内置的inspector独立了出去,需要单独安装inspector进行调试。确保inspector对应…

任意密码重置+CRRF

一、XSS漏洞 在商城的搜索处,输入标准语句的传参直接就可以弹窗 二、逻辑漏洞-用户枚举 在用户注册界面,点击发送验证码,然后用BURP发包 更改手机号传参,这里手机号传参没有进行加密,直接用手机号的位置进行爆破 正确的…

LeetCode力扣每日一题(Java):9、回文数

一、题目 二、解题思路 1、我的思路 当x<0时&#xff0c;x一定不是回文数&#xff0c;直接返回false 当x>0且x<10时&#xff0c;x一定是回文数&#xff0c;直接返回true x>10时&#xff0c;先将x转为字符串。将数字转成字符串方法挺多的&#xff0c;以下是&…

06、基于内容的过滤算法Tensorflow实现

06、基于内容的过滤算法Tensorflow实现 开始学习机器学习啦&#xff0c;已经把吴恩达的课全部刷完了&#xff0c;现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 05、基于梯度下降的协同过滤算法中已经介绍了协同过滤算法的基本实现方法&#xff0c;但是这种方法仅…

SpringBoot集成i18n(多语言)

配置文件 spring: messages: basename: il8n/messages # 配置国际化资源文件路径 fallback-to-system-locale: true # 是否使用系统默认的语言环境作为备选项 国际化配置 import org.springframework.context.annotation.Bean; import org.spr…

Spring中通知是什么

面向切面编程 这个切面是哪个面 面向切面编程&#xff08;Aspect-Oriented Programming&#xff0c;AOP&#xff09;是一种编程范式&#xff0c;它通过切面&#xff08;Aspect&#xff09;来分离横切关注点&#xff08;Cross-cutting Concerns&#xff09;和核心业务逻辑。 在…

MySQL-宋红康-(课P14-P15)-基本查询语句(Select)

b站视频&#xff1a; 14-最基本的SELECT...FROM结构_哔哩哔哩_bilibili 8.4 基本查询(Select)语句 数据table: emp员工表创建如下 # 员工表 CREATE TABLE EMP (EMPNO INT PRIMARY KEY, -- 员工编号ENAME VARCHAR(10), -- 员工名称JOB VARCHAR(9), -- 工…

10、SQL注入——数据库基础

文章目录 一、数据库概述二、数据库分类Mysql数据库连接方法 三、识别数据库四、SQL语法4.1 SQL基本语法4.2 高级操作 一、数据库概述 数据库&#xff08;database&#xff09;&#xff1a;存储在磁盘、磁带、光盘或其他外存介质上、按一定结构组织在一起的相关数据的集合。数…

webpack对项目进行优化

对项目进行优化是提高性能和效率的关键&#xff0c;以下是一些实用的Webpack优化技巧&#xff1a; 代码拆分&#xff08;Code Splitting&#xff09;&#xff1a;将代码拆分为多个小块&#xff0c;按需加载。通过配置splitChunks插件&#xff0c;可以将公共代码提取到单独的文件…

常见代码优化案例记录

1. 使用StringBuilder优化字符串拼接&#xff1a; // 不优化的写法 String result ""; for (int i 0; i < 1000; i) {result i; }// 优化的写法 StringBuilder resultBuilder new StringBuilder(); for (int i 0; i < 1000; i) {resultBuilder.append(i)…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1&#xff1a;2的分配器&#xff0c;符合HDMI2.0/1.4规范&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出&#xff0c;以支持长电缆应用程序&#xff0c;内部TX通道交换灵活的PCB…

部分c++11特性介绍

在2003年C标准委员会曾经提交了一份技术勘误表(简称TC1)&#xff0c;使得C03这个名字已经取代了C98称为C11之前的最新C标准名称。不过由于C03(TC1)主要是对C98标准中的漏洞进行修复&#xff0c;语言的核心部分则没有改动&#xff0c;因此人们习惯性的把两个标准合并称为C98/03标…

Day50力扣打卡

打卡记录 三个无重叠子数组的最大和 链接 滑动窗口 class Solution:def maxSumOfThreeSubarrays(self, nums: List[int], k: int) -> List[int]:n, ans len(nums), []sum1 sum2 sum3 0maxsum1idx, maxsum12idx 0, ()maxsum1 maxsum12 total 0for i in range(2 * …

01 高等数学.武忠祥.0基础

第一章 函数与极限 01映射与函数 02 函数概念 对应法则 定义域 常见函数 函数的几种特性 周期函数不一定有最小周期。 涉及额外与复习 存在与任意的关系

在python中自己定义一个方法,但是没有写return XXX会有什么影响

【多么痛的领悟&#xff0c;找了两个小时的错误&#xff01;&#xff01;&#xff01;发现是少写个return】 print(data.task_ID) AttributeError: NoneType object has no attribute task_ID** 然后一句一句找&#xff0c;我找啊找&#xff01;&#xff01;&#xff01;&…