【Java】使用Timer实现的定时任务,支持按规则执行。

学会这10种JAVA定时任务多种方式集锦,我有点飘了 前言最近有几个读者私信给我,问我他们的业务场景,要用什么样的定时任务。确实,在不用的业务场景下要用不同的定时任务,其实我们的选择还是挺多的。我今天给大家总结10种非常实用的定时任务,总有一种是适合你的。一. linux自带的定时任务crontab不知道你有没有遇到过这种场景:有时需要临时统计线上的数据,然后导出到excel表格中。这种需求有时较为复杂,光靠写sql语句是无法满足需求的,这就需要写java代码了。然后将该程序打成一个jar包,在线上环境执行,最后将生成的excel文件下载到本地。为了减小对线上 阅读详情

重要声明:本文章仅仅代表了作者个人对此观点的理解和表述。读者请查阅时持自己的意见进行讨论。

本文原地址:https://www.microanswer.cn/blog/32

一、需求

在业务开发中常常出现将结果回调给对接渠道的需求,而回调为了保证成功,通常都会有一个失败重试的功能,这样就需要有一个重试规则,并有一个比较好的机制来处理,而又不关心任务是否可控。

二、实现

根据这样一个需求,可以使用Java提供的Timer来实现,下面是代码。

/**
 * 按rule指定的规则执行 fun 方法<br>
 * 规则的指定: "0 60 120 200"<br>
 *      含义:立刻执行一次方法,待60秒执行一次,再待120秒执行,依次推类,单位始终为秒。<br>
 *      若某一次执行后,后续不希望再执行,d0 方法请返回 true;<br>
 * @param fun  要执行的方法。
 * @param rule 规则。
 */
public static void runWithRule(final Fun fun, String rule) {
    final String[] times = rule.split(" ");

    final Timer timer = new Timer();
    final int[] timeIndex = {0};

    timer.schedule(
            newTimerTask(fun, timeIndex, times, timer),
            Integer.parseInt(times[timeIndex[0]]) * 1000
    );

}
private static TimerTask newTimerTask(
        final Fun fun,
        final int []timeIndex,
        final String[] times,final Timer timer
) {
    return new TimerTask() {
        @Override
        public void run() {
            boolean success = fun.d0();

            // 返回值是 false, 表示后续要继续执行。
            if (!success) {

                // 已经执行完了所有规则。
                if (timeIndex[0] >= (times.length - 1)) {

                    timer.cancel();
                    return;
                }

                timeIndex[0]++;
                timer.schedule(
                        newTimerTask(fun, timeIndex, times, timer),
                        Integer.parseInt(times[timeIndex[0]]) * 1000
                );
            } else {
                // 返回值是true, 不用再执行了。
            }
        }
    };
}
public interface Fun{
    boolean d0();
}

其中分出了一个私有方法,每次timer进行任务注入是,都是使用new的新的TimerTask,TimerTask不能重用,因此提取一个方法出来作为创建TimerTask的私有方法。

三、使用

现在,只需要使用暴露的 runWithRule 即可完成对应功能:

public static void main(String[] args) {
    // 打印程序开始时间,方便对比
    System.out.println(new Date());

    // 调用工具方法
    runWithRule(new Fun() {
        @Override
        public boolean d0() {
            System.out.println(new Date());
            return false;
        }
    }, "1 5 5 10");
}

输出结果:

Tue Sep 03 10:32:03 CST 2019 // 这是第一行打印的程序开始时间。
Tue Sep 03 10:32:04 CST 2019 // 过1秒,执行任务了,与规则符合。
Tue Sep 03 10:32:09 CST 2019 // 过5秒执行,与规则符合。
Tue Sep 03 10:32:14 CST 2019 // 过5秒执行,符合。
Tue Sep 03 10:32:24 CST 2019 // 过10秒执行,符合。

yeah!

Java中使用Timer实现定时执行任务(1) 【代码】Java中使用Timer实现定时执行任务(1) 阅读详情

相关推荐

Java Timer使用介绍

由于Timer内部仅维护一个线程来执行所有任务,所以当前一个任务耗时过长,可能会导致后一个任务的执行被延误。出现任务延误的情况下,固定延时 schedule和 固定速率 scheduleAtFixedRate 的区别就在于,schedule会顺延,而scheduleAtFixedRate会把延误任务立马补上。在网上看到几个非常恰当的例子,贴上来加深理解。例1:暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业。老师要求学生暑假每天写2页,30天后完成作业。

「 虚幻私塾」 779

Java实现定时任务的五种方式(Quartz)

Quartz是一个开源的Java调度框架,可以用来实现在指定的时间或时间间隔触发任务执行的功能。它支持多种方式的作业调度,如基于日期、时间间隔和Cron表达式的调度。Quartz允许开发人员定义并执行大量的作业,并且在大规模部署时可以实现高可靠性、高可用性和可伸缩性。

qq_44861126的博客 1万+

spring执行定时任务的规则

Spring中执行定时任务是个很常见的需求,这里是详细的规则说明,有需要的朋友可以参考,跟linux中的crontab规则很相似。

Android定时器Timer.schedule

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。 schedule的意思(时间表、进度表) timer.schedule(new MyTask(event.getServletContext()), 0, 60*60*1000); 第一个参数"n

liuwise的专栏 3万+

Photoshop免费获取指南:官方试用与开源替代方案详解

图像处理软件是数字内容创作的核心工具,其工作原理基于像素编辑、图层叠加与算法滤镜。这类软件的技术价值在于为设计师、摄影师和内容创作者提供了强大的视觉表达能力,广泛应用于平面设计、UI/UX、摄影后期及社交媒体内容制作等场景。在众多工具中,Adobe Photoshop以其全面的功能和行业标准地位备受关注。对于希望免费体验或使用的用户,存在合法且安全的途径。其中,Adobe官方提供的7天免费试用版允许用户在安全环境下体验完整功能,而开源替代方案如GIMP则提供了长期免费的强大图像编辑能力。理解这些合法获取方式

cigang4063的博客 524

手把手教你用Matlab搞定GRACE RL06数据读取:冯伟老师工具箱无GUI版实战

本文详细介绍了如何使用Matlab处理GRACE RL06数据,重点解析了冯伟教授工具箱的无GUI版实战操作。通过环境配置、核心函数改造和批处理技巧,帮助科研工作者高效完成重力场数据的读取与分析,特别适合服务器集群环境下的批量处理需求。

weixin_29313817的博客 200

Java 六种定时任务格式

范例1:定时任务格式timer.schedule(TimerTask task, Date time) package com.contoso; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Timer; import ja...

zhengzizhi的专栏 1782

STM32——IIC(I2C)中断与DMA通信实战解析

本文深入解析STM32的IIC(I2C)通信中断与DMA实战应用。通过对比轮询方式的低效,详细介绍中断模式和DMA模式的实现原理、状态机编程技巧及性能优化策略,并结合SHT30传感器案例展示如何高效读取数据,显著提升系统响应速度和CPU利用率。

week9的博客 807

Java中定时任务的6种实现方式,你知道几种?

几乎在所有的项目中,定时任务的使用都是不可或缺的,如果使用不当甚至会造成资损。还记得多年前在做金融系统时,出款业务是通过定时任务对外打款,当时由于银行接口处理能力有限,外加定时任务使用不当,导致发出大量重复出款请求。还好在后面环节将交易卡在了系统内部,未发生资损。 所以,系统的学习一下定时任务,是非常有必要的。这篇文章就带大家整体梳理学习一下Java领域中常见的几种定时任务实现。 线程等待实现 先从最原始最简单的方式来讲解。可以先创建一个thread,然后让它在while循环里一直运行着,通过sleep方法

程序新视界 8万+

Anthropic发布10款金融AI智能体模板深度解析:重构华尔街工作范式

摘要:2026年5月,Anthropic发布10款金融AI智能体模板,标志着AI从辅助工具升级为"虚拟同事"。这些智能体深度集成到Word、Excel等办公软件中,覆盖投行、商行、资管三大场景的核心工作流,预计可提升效率35-85%。技术架构基于Claude3.5Sonnet模型,具备200K上下文窗口和95%+的财务图表解析准确率,并与彭博等金融数据源直连。发布引发传统金融数据服务商股价下跌,摩根大通等机构则视其为成本优化工具。落地需分四阶段推进,关键在于数据治理和复合型人才培养。未来

yyq916的博客 635

TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南)

本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。

weixin_30693683的博客 516

Timer.schedule方法的使用

java.util.Timer定时器的常用方法如下: schedule(TimerTask task, long delay) // 延迟delay毫秒后,执行一次task。 schedule(TimerTask task, long delay, long period) // 延迟delay毫秒后,执行第一次task,然后每隔period毫秒执行一次task。 举例: TimerTask ......

冰雪世界 5万+

实战:利用 Agent Harness 自动化 PPT 制作

本文将带你从零开始,用轻量级Agent编排框架,结合主流大模型(GPT-4o、通义千问、文心一言等),搭建一套全自动化的PPT生成工作流:从用户输入自然语言需求,到需求解析、大纲生成、内容填充、数据匹配、排版美化、导出成品,全程不需要手动操作,最快10分钟就能产出符合要求的PPT。我们不会讲晦涩的Agent理论,所有步骤都有可直接运行的代码示例,哪怕你只有基础的Python语法基础,也能跟着一步步做出能用的自动PPT工具。

AI Agent Harness Engineering 569

学会这10种定时任务,我有点飘了

往期热门文章:1、大家注意了,JavaBean转Map有一个巨坑千万小心! 2、别再用currentTimeMillis统计耗时了,太 Low,试试StopWatch吧! 3、一个update语句执行要10s,大厂的架构真垃圾! 4、Java/Spring/Dubbo三种SPI机制,谁更好? 5、Java Bean 转 Map 的巨坑,注意了!!!前言最近有几个读者私信给我,问我他们的业务场景,要...

Java后端技术 237

addr2line解析不出来行号的解决方式(汇编解析高阶版)

摘要:本文针对AEC crash问题中addr2line无法解析行号的情况,通过llvm-addr2line和反汇编分析,定位到CamX::AECBEStats17::AdjustROIParams函数中的乘法溢出问题。关键发现包括: 常规addr2line只能解析到函数名但无具体行号 llvm-addr2line解析出多个可能溢出点(行196/204/211/218/270/271) 反汇编显示6个条件分支跳转到溢出处理函数 源码分析确认这些位置均存在乘法运算 最终通过汇编级调试工具成功定位UBsan报告

168

拿下华为性格测试!

华为性格测试指南

weixin_41171614的博客 5276

Java中使用Timer实现定时执行任务

【代码】Java中使用Timer实现定时执行任务。

2401_84010497的博客 329

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Java定时任务调度框架

Java定时任务调度框架1. 定时任务调度概述1.1 业务场景概述1.2 任务调度场景1.3 调度任务分类2. 定时任务调度详解2.1 Timer2.2 ScheduledExecutorService2.3 SpringTask2.4 Quartz2.5 xxl-job2.6 elastic-job 1. 定时任务调度概述 1.1 业务场景概述 日常开发中定时任务使用场景很多,比如支付系统每天凌晨定时清算对账;未支付订单超时回收;商品定时上下架等等。定时任务框架选择有很多,面对不同的业务场景可以选择不同的

靖节先生的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JAVA定时任务 - JDK Timer

而Runable方式下就只是new了一个Runable对象,然后new了多个Thread、启动多个线程执行的时候是把这个唯一的Runable对象传递给了Thread的target,不同线程持有的是相同的Runable对象作为他们的target,同一个对象的成员变量当然是共享的。但是这个执行时间其实Timer是没有办法保证的,因为线程挂起之后再次被唤醒是依赖于CPU的调度的,CPU在10秒执行了一次任务之后,下次任务不一定能在20秒被唤醒,有可能是22秒或者23秒的时候才会被唤醒。

weixin_44612246的博客 891

【定时任务】JDK java.util.Timer定时器的实现原理

在程序中简单实用Timer的方法,参考学习。 定时任务,也叫定时器,是指在指定的时间执行指定任务的机制,类似于Windows自带的计划任务。JDK中提供了定时器的支持—java.util.Timer,下面我们来系统学习一下它的实现原理。 Timer主要由三个部分组成: 任务TimerTask、任务队列TaskQueue和 任务调试者TimerThread。多个任务单元 TimerTask按照一...

lmb55的专栏 1415

Java如何实现定时任务?

看完这篇文章你会了解到什么是定时任务,以及为什么austin项目要引入分布式定时任务框架,可以把代码下载下来看到我是怎么使用xxl-job的。 01、如何简单实现定时功能? 我是看视频入门Java的,那时候学Java基础API的时候,看的视频也带有讲定时功能(JDK原生就支持),我记得视频讲师写了Timer来讲解定时任务。 当时并不知道定时任务有什么实际作用,所以在初学阶段的我,从来没使用过Timer来实现定时的功能。 再后来,我学到并发了。那时候的讲师提到了ScheduledExecutorServic

m0_68064743的博客 6356

Java中使用Timer实现定时执行任务(2)

【代码】Java中使用Timer实现定时执行任务(2)

efgtrrg的博客 318

SpringBoot定时任务使用详解

在进行SpringBoot的定时任务使用介绍之前,我觉得有必要向大家说明一下实现定时任务的几种方式。 如果你不想了解其他方式,可跳过第一节。 一、定时任务的几种实现方式 在JAVA开发领域,目前可以通过以下几种方式进行定时任务: (注:因为这篇文章主要介绍在SpringBoot中使用定时任务,所以其他实现方式这里只做简单记录,有兴趣的可以去深入了解) 1、Timer:jdk中自带的...

Evan's Blog ٩(๑❛ᴗ❛๑)۶ 3549

Spring Boot实现定时任务

定时任务是指在预定的时间点或按照特定的时间间隔自动执行的任务。操作系统维护:例如,定期清理临时文件、更新系统补丁等。数据备份:定期对重要数据进行备份,以防数据丢失。自动化测试:例如,在每天凌晨自动运行软件测试脚本。网站维护:比如定时发布新内容、定时发送邮件提醒等。数据分析:例如,定期汇总和分析业务数据,生成报告。

这河里吗l的博客 5448
上一篇: 【Vue】记录如何为构造函数式组件传参
下一篇: 桌面网页上实现分享功能,分享到QQ空间、新浪微博、人人网
Microanswer
博客等级 码龄10年 38粉丝 40原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值