详解 Java 定时任务

Java定时任务详解 在Java开发中,定时任务是一个常见的需求,比如定时备份数据、定时清理日志、定时发送邮件等。Java提供了多种实现定时任务的方式,本文将详细介绍Java中定时任务的实现方式、底层逻辑、使用方法以及示例代码。Timer 和 TimerTask:简单易用,但功能有限,不适合复杂场景。ScheduledExecutorService:基于线程池,提供了更好的性能和灵活性。Spring Task Scheduler:适合Spring项目,简化了定时任务的开发。 阅读详情

原文地址:http://wiki.jikexueyuan.com/project/java-enhancement/java-add1.html



在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用 JDK 中的 Timer 定时任务来实现。下面 LZ 就其原理、实例以及 Timer 缺陷三个方面来解析 Java Timer 定时器。

一、简介

在 Java 中一个完整定时任务需要由 Timer、TimerTask 两个类来配合完成。 API 中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。由TimerTask:Timer 安排为一次执行或重复执行的任务。我们可以这样理解 Timer 是一种定时器工具,用来在一个后台线程计划执行指定任务,而 TimerTask 一个抽象类,它的子类代表一个可以被 Timer 计划的任务。

Timer 类

在工具类 Timer 中,提供了四个构造方法,每个构造方法都启动了计时器线程,同时 Timer 类可以保证多个线程可以共享单个 Timer 对象而无需进行外部同步,所以 Timer 类是线程安全的。但是由于每一个 Timer 对象对应的是单个后台线程,用于顺序执行所有的计时器任务,一般情况下我们的线程任务执行所消耗的时间应该非常短,但是由于特殊情况导致某个定时器任务执行的时间太长,那么他就会“独占”计时器的任务执行线程,其后的所有线程都必须等待它执行完,这就会延迟后续任务的执行,使这些任务堆积在一起,具体情况我们后面分析。

当程序初始化完成 Timer 后,定时任务就会按照我们设定的时间去执行, Timer 提供了 schedule 方法,该方法有多中重载方式来适应不同的情况,如下:

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

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

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

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

同时也重载了 scheduleAtFixedRate 方法,scheduleAtFixedRate 方法与 schedule 相同,只不过他们的侧重点不同,区别后面分析。

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

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

TimerTask

TimerTask 类是一个抽象类,由 Timer 安排为一次执行或重复执行的任务。它有一个抽象方法 run() 方法,该方法用于执行相应计时器任务要执行的操作。因此每一个具体的任务类都必须继承 TimerTask,然后重写 run() 方法。

另外它还有两个非抽象的方法:

boolean cancel():取消此计时器任务。

long scheduledExecutionTime():返回此任务最近实际执行的安排执行时间。

二、实例

2.1、指定延迟时间执行定时任务


    public class TimerTest01 {
        Timer timer;
        public TimerTest01(int time){
            timer = new Timer();
            timer.schedule(new TimerTaskTest01(), time * 1000);
        }

        public static void main(String[] args) {
            System.out.println("timer begin....");
            new TimerTest01(3);
        }
    }

    public class TimerTaskTest01 extends TimerTask{

        public void run() {
            System.out.println("Time's up!!!!");
        }
    }

运行结果:


    首先打印:timer begin....

    3秒后打印:Time's up!!!!

2.2、在指定时间执行定时任务


    public class TimerTest02 {
        Timer timer;

        public TimerTest02(){
            Date time = getTime();
            System.out.println("指定时间time=" + time);
            timer = new Timer();
            timer.schedule(new TimerTaskTest02(), time);
        }

        public Date getTime(){
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, 11);
            calendar.set(Calendar.MINUTE, 39);
            calendar.set(Calendar.SECOND, 00);
            Date time = calendar.getTime();

            return time;
        }

        public static void main(String[] args) {
            new TimerTest02();
        }
    }

    public class TimerTaskTest02 extends TimerTask{

        @Override
        public void run() {
            System.out.println("指定时间执行线程任务...");
        }
    }

当时间到达 11:39:00 时就会执行该线程任务,当然大于该时间也会执行!!执行结果为:


    指定时间 time=Tue Jun 10 11:39:00 CST 2014
    指定时间执行线程任务...

2.3、在延迟指定时间后以指定的间隔时间循环执行定时任务


    public class TimerTest03 {
        Timer timer;

        public TimerTest03(){
            timer = new Timer();
            timer.schedule(new TimerTaskTest03(), 1000, 2000);
        }

        public static void main(String[] args) {
            new TimerTest03();
        }
    }

    public class TimerTaskTest03 extends TimerTask{

        @Override
        public void run() {
            Date date = new Date(this.scheduledExecutionTime());
            System.out.println("本次执行该线程的时间为:" + date);
        }
    }

运行结果:


    本次执行该线程的时间为:Tue Jun 10 21:19:47 CST 2014
    本次执行该线程的时间为:Tue Jun 10 21:19:49 CST 2014
    本次执行该线程的时间为:Tue Jun 10 21:19:51 CST 2014
    本次执行该线程的时间为:Tue Jun 10 21:19:53 CST 2014
    本次执行该线程的时间为:Tue Jun 10 21:19:55 CST 2014
    本次执行该线程的时间为:Tue Jun 10 21:19:57 CST 2014
    .................

对于这个线程任务,如果我们不将该任务停止,他会一直运行下去。

对于上面三个实例,LZ 只是简单的演示了一下,同时也没有讲解 scheduleAtFixedRate 方法的例子,其实该方法与 schedule 方法一样!

2.4、分析 schedule 和 scheduleAtFixedRate

1、schedule(TimerTask task, Date time)、schedule(TimerTask task, long delay)

对于这两个方法而言,如果指定的计划执行时间 scheduledExecutionTime<= systemCurrentTime,则 task 会被立即执行。scheduledExecutionTime 不会因为某一个 task 的过度执行而改变。

2、schedule(TimerTask task, Date firstTime, long period)、schedule(TimerTask task, long delay, long period)

这两个方法与上面两个就有点儿不同的,前面提过 Timer 的计时器任务会因为前一个任务执行时间较长而延时。在这两个方法中,每一次执行的 task 的计划时间会随着前一个 task 的实际时间而发生改变,也就是 scheduledExecutionTime(n+1)=realExecutionTime(n)+periodTime。也就是说如果第 n 个 task 由于某种情况导致这次的执行时间过程,最后导致 systemCurrentTime>= scheduledExecutionTime(n+1),这是第 n+1 个 task 并不会因为到时了而执行,他会等待第 n 个 task 执行完之后再执行,那么这样势必会导致 n+2 个的执行实现 scheduledExecutionTime 放生改变即 scheduledExecutionTime(n+2) = realExecutionTime(n+1)+periodTime。所以这两个方法更加注重保存间隔时间的稳定。

3、scheduleAtFixedRate(TimerTask task, Date firstTime, long period)、scheduleAtFixedRate(TimerTask task, long delay, long period)

在前面也提过 scheduleAtFixedRate 与 schedule 方法的侧重点不同,schedule 方法侧重保存间隔时间的稳定,而 scheduleAtFixedRate 方法更加侧重于保持执行频率的稳定。为什么这么说,原因如下。在 schedule 方法中会因为前一个任务的延迟而导致其后面的定时任务延时,而 scheduleAtFixedRate 方法则不会,如果第 n 个 task 执行时间过长导致 systemCurrentTime>= scheduledExecutionTime(n+1),则不会做任何等待他会立即执行第 n+1 个 task,所以 scheduleAtFixedRate 方法执行时间的计算方法不同于 schedule,而是 scheduledExecutionTime(n)=firstExecuteTime +n*periodTime,该计算方法永远保持不变。所以 scheduleAtFixedRate 更加侧重于保持执行频率的稳定。

三、Timer 的缺陷

3.1、Timer 的缺陷

Timer 计时器可以定时(指定时间执行任务)、延迟(延迟 5 秒执行任务)、周期性地执行任务(每隔个 1 秒执行任务),但是,Timer 存在一些缺陷。首先 Timer 对调度的支持是基于绝对时间的,而不是相对时间,所以它对系统时间的改变非常敏感。其次 Timer 线程是不会捕获异常的,如果 TimerTask 抛出的了未检查异常则会导致 Timer 线程终止,同时 Timer 也不会重新恢复线程的执行,他会错误的认为整个 Timer 线程都会取消。同时,已经被安排单尚未执行的 TimerTask 也不会再执行了,新的任务也不能被调度。故如果 TimerTask 抛出未检查的异常,Timer 将会产生无法预料的行为。

1、Timer 管理时间延迟缺陷

前面 Timer 在执行定时任务时只会创建一个线程任务,如果存在多个线程,若其中某个线程因为某种原因而导致线程任务执行时间过长,超过了两个任务的间隔时间,会发生一些缺陷:


    public class TimerTest04 {
        private Timer timer;
        public long start;   

        public TimerTest04(){
            this.timer = new Timer();
            start = System.currentTimeMillis();
        }

        public void timerOne(){
            timer.schedule(new TimerTask() {
                public void run() {
                    System.out.println("timerOne invoked ,the time:" + (System.currentTimeMillis() - start));
                    try {
                        Thread.sleep(4000);    //线程休眠3000
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, 1000);
        }

        public void timerTwo(){
            timer.schedule(new TimerTask() {
                public void run() {
                    System.out.println("timerOne invoked ,the time:" + (System.currentTimeMillis() - start));
                }
            }, 3000);
         }

        public static void main(String[] args) throws   Exception {
            TimerTest04 test = new TimerTest04();

            test.timerOne();
            test.timerTwo();
        }
    }

按照我们正常思路,timerTwo 应该是在 3s 后执行,其结果应该是:


    timerOne invoked ,the time:1001
    timerOne invoked ,the time:3001

但是事与愿违,timerOne 由于 sleep(4000),休眠了 4S,同时 Timer 内部是一个线程,导致 timeOne 所需的时间超过了间隔时间,结果:


    timerOne invoked ,the time:1000
    timerOne invoked ,the time:5000
2、Timer 抛出异常缺陷

如果 TimerTask 抛出 RuntimeException,Timer 会终止所有任务的运行。如下:


    public class TimerTest04 {
        private Timer timer;

        public TimerTest04(){
            this.timer = new Timer();
        }

        public void timerOne(){
            timer.schedule(new TimerTask() {
                public void run() {
                    throw new RuntimeException();
                }
            }, 1000);
        }

        public void timerTwo(){
            timer.schedule(new TimerTask() {

                public void run() {
                    System.out.println("我会不会执行呢??");
                }
            }, 1000);
        }

        public static void main(String[] args) {
            TimerTest04 test = new TimerTest04();
            test.timerOne();
            test.timerTwo();
        }
    }

运行结果:timerOne 抛出异常,导致 timerTwo 任务终止。


    Exception in thread "Timer-0" java.lang.RuntimeException
        at com.chenssy.timer.TimerTest04$1.run(TimerTest04.java:25)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)

对于 Timer 的缺陷,我们可以考虑 ScheduledThreadPoolExecutor 来替代。Timer 是基于绝对时间的,对系统时间比较敏感,而 ScheduledThreadPoolExecutor 则是基于相对时间;Timer 是内部是单一线程,而 ScheduledThreadPoolExecutor 内部是个线程池,所以可以支持多个任务并发执行。

3.2、用 ScheduledExecutorService 替代 Timer

1、解决问题一:

    public class ScheduledExecutorTest {
        private  ScheduledExecutorService scheduExec;

        public long start;

        ScheduledExecutorTest(){
            this.scheduExec =  Executors.newScheduledThreadPool(2);  
            this.start = System.currentTimeMillis();
        }

        public void timerOne(){
            scheduExec.schedule(new Runnable() {
                public void run() {
                    System.out.println("timerOne,the time:" + (System.currentTimeMillis() - start));
                    try {
                        Thread.sleep(4000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            },1000,TimeUnit.MILLISECONDS);
        }

        public void timerTwo(){
            scheduExec.schedule(new Runnable() {
                public void run() {
                    System.out.println("timerTwo,the time:" + (System.currentTimeMillis() - start));
                }
            },2000,TimeUnit.MILLISECONDS);
        }

        public static void main(String[] args) {
            ScheduledExecutorTest test = new ScheduledExecutorTest();
            test.timerOne();
            test.timerTwo();
        }
    }

运行结果:


    timerOne,the time:1003
    timerTwo,the time:2005
2、解决问题二

    public class ScheduledExecutorTest {
        private  ScheduledExecutorService scheduExec;

        public long start;

        ScheduledExecutorTest(){
            this.scheduExec =  Executors.newScheduledThreadPool(2);  
            this.start = System.currentTimeMillis();
        }

        public void timerOne(){
            scheduExec.schedule(new Runnable() {
                public void run() {
                    throw new RuntimeException();
                }
            },1000,TimeUnit.MILLISECONDS);
        }

        public void timerTwo(){
            scheduExec.scheduleAtFixedRate(new Runnable() {
                public void run() {
                     System.out.println("timerTwo invoked .....");
                }
            },2000,500,TimeUnit.MILLISECONDS);
        }

        public static void main(String[] args) {
            ScheduledExecutorTest test = new ScheduledExecutorTest();
            test.timerOne();
            test.timerTwo();
        }
    }

运行结果:


    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    timerTwo invoked .....
    ........................

Java 定时任务详解 单机定时任务的常见解决方案有TimerDelayQueue、Spring Task 和时间轮,其中最常用也是比较推荐使用的是时间轮。另外,这几种单机定时任务解决方案同样可以实现延时任务。Redis 和 MQ 虽然可以实现分布式定时任务,但这两者本身不是专门用来做分布式定时任务的,它们并不提供较为完整和强大的分布式定时任务的功能。而且,两者不太适合执行周期性的定时任务,因为它们只能保证消息被消费一次,而不能保证消息被消费多次。因此,它们更适合执行一次性的延时任务,例如订单取消、红包撤回。 阅读详情

相关推荐

Java定时任务调度详解

前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券;比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。本篇博客将系统的介绍定时任务调度,会涵盖Timer、ScheduledExecutorService、开源工具包Quartz,以及Spring和Quartz的结合等内容。

m0_62714732的博客 2512

时间轮算法HashedWheelTimer

让你眼前一亮的Timer, 这种思想绝对值得学习

在路上 6209

荔枝派Lichee Nano全志F1C100s烧录避坑指南:从Fel模式到SPI Flash完整流程

本文详细介绍了荔枝派Lichee Nano基于全志F1C100s芯片的SPI Flash烧录完整流程,从FEL模式进入技巧到定制化sunxi-tools编译,再到分区策略与实战烧录步骤。针对开发者常见的烧录程序问题提供了专业解决方案,帮助用户高效完成嵌入式系统部署。

tea88的博客 788

HashedWheelTimer 使用及源码分析

本文介绍的 HashedWheelTimer 是来自于 Netty 的工具类,在 netty-common 包中。它用于实现延时任务。另外,下面介绍的内容和 Netty 无关。 如果你看过 Dubbo 的源码,一定会在很多地方看到它。在需要失败重试的场景中,它是一个非常方便好用的工具。 本文将会介绍 HashedWheelTimer 的使用,以及在后半部分分析它的源码实现。 接口概览 在介绍它的使用前,先了解一下它的接口定义,以及和它相关的类。 HashedWheelTimer 是接口 io.ne

daobuxinzi的博客 3591

Synopsys AXI VIP 从环境搭建到首个验证场景运行

本文详细介绍了Synopsys AXI VIP从环境搭建到首个验证场景运行的全过程,包括VIP安装、示例工程生成、验证环境解析、仿真调试技巧及进阶优化。特别针对AXI协议验证中的常见问题提供了实用解决方案,帮助工程师快速掌握这一SoC验证必备工具。

weixin_29185493的博客 340

统信UOS/麒麟ARM桌面版,不联网也能用Docker部署MySQL 5.7(离线部署详解)

本文详细介绍了在统信UOS/银河麒麟ARM桌面版系统中,如何离线部署MySQL 5.7的完整流程。通过Docker技术实现环境隔离和依赖封装,解决了封闭网络环境下的部署难题,包括资源准备、系统配置、容器化部署及安全加固等关键步骤,为政企和科研场景提供实用解决方案。

weixin_30892037的博客 229

基于时间轮的定时器HashedWheelTimer

最近在阅读Redisson的源码时看到了内部使用了netty提供的这个组件,就想着看下这个定时器具体是如何实现的?先介绍一下HashedWheelTimer,它是基于时间轮实现的一个定时器,它的优点是实现相对简单,缺点是无法精确、准时地执行定时任务,只能是近似执行。因为时间轮中每个刻度大小可能是100ms也可能1ms,所以在执行任务时,时间上会存在一点误差,在大部分网络应用中,IO任务的执行时间往往不需要那么精确,因此默认每个刻度小大是100ms,但你可以自己来调整刻度大小,最小是1ms。

m0_53157173的博客 1862

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4214

Netty源码系列 之 HashedWheelTimer源码

Netty源码之HashedWheelTimer

Eriksen的博客 1330

Rust 与 Golang 深度对决:从语法到应用场景的全方位解析

Rust 定义函数以fn关键字开头,参数需明确指定类型,返回值类型紧跟在箭头->之后。// 定义函数add,接收两个i32类型参数a和b,返回i32类型结果,功能为两数相加a + bRust 和 Golang 各有千秋,在不同领域展现独特优势。Rust 凭借强大的内存安全与高性能,在系统编程、网络编程以及对内存安全和性能要求高的场景中表现突出;Golang 则以简洁语法和出色并发性能,在云计算、分布式系统、Web 开发等领域占据一席之地。

muyouking 1769

华为昇腾开发——多模型资源管理(C++)

在使用Ascend ACL(Ascend Computing Language)的ACLLite库进行多模型推理时,合理的资源管理至关重要。

如果想成为中心,那么就到中心去吧。 575

netty系列之:HashedWheelTimer一种定时器的高效实现

定时器是一种在实际的应用中非常常见和有效的一种工具,其原理就是把要执行的任务按照执行时间的顺序进行排序,然后在特定的时间进行执行。JAVA提供了java.util.Timer和java.util.concurrent.ScheduledThreadPoolExecutor等多种Timer工具,但是这些工具在执行效率上面还是有些缺陷,于是netty提供了HashedWheelTimer,一个优化的Timer类。一起来看看netty的Timer有何不同吧。Timer是JAVA在1.3中引入的。所有的任务都存储在

程序那些事 1166

视觉测量实战:C#上位机+OpenCVSharp 实现工业零件尺寸自动检测(精准像素级,工业级可落地)

本次开发的上位机界面遵循工业现场操作规范简洁、直观、按钮大、文字清晰、参数可视化调节,操作人员为车间工人/质检员,无需复杂操作,所有控件均为WinForms原生控件,拖拽即可完成布局本次实战完成了C#上位机+OpenCVSharp 工业零件尺寸自动检测系统的完整开发,这套方案是工业视觉测量的标准落地方案,适配95%的规则几何零件的尺寸检测场景,从五金件、塑胶件到电子元件,全覆盖无死角。测量效率提升100倍、精度提升10倍、无人工误差、可适配流水线实时检测。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 848

详解java定时任务

学习Java的同学注意了!!! 学习过程中遇到什么问题或者想获取学习资源的话,欢迎加入Java学习交流群,群号码:492139965 我们一起学Java! 在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。一、简介在java中一个完整定...

qq_36428332的博客 202

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1699

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java中@Scheduled定时任务详解

Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式: (1) Seconds Minutes Hours DayofMonth Month DayofWeek Year (2)Seconds Minutes Hours DayofMonth Month DayofWeek 一、结构 corn从左到右(用空格隔开): 秒 分 小时 月份中的日期 月份 星期中的日期 年份 二、各字段的含义 注意事项: 每一个域都使用数字,但还可以出现如下特殊

筱筱攻程师的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

linux java定时任务_详解Java定时任务

在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析Java Timer定时器。Java对象序列化ObjectOutputStream和ObjectInputStream示例 http://www.linuxidc.com/Linux/2012-08/68360.htm一、简介在...

weixin_39713578的博客 120

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

必须掌握的JAVA详解之——定时任务

前言 在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛,比如某些视频网站,购买会员后,每天会给会员送成长值,每月会给会员送一些电影券;比如在保证最终一致性的场景中,往往利用定时任务调度进行一些比对工作;比如一些定时需要生成的报表、邮件;比如一些需要定时清理数据的任务等。本篇博客将系统的介绍定时任务调度,会涵盖Timer、ScheduledExecutorService、开源工具包Quartz,以及Spring和Quartz的结合等内容。 J

weixin_48675511的博客 420

java实现定时任务 schedule_详解java定时任务

在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。一、简介在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,...

weixin_39747595的博客 1662

java 定时任务 实例_详解java定时任务

在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现。下面LZ就其原理、实例以及Timer缺陷三个方面来解析java Timer定时器。一、简介在java中一个完整定时任务需要由Timer、TimerTask两个类来配合完成。 API中是这样定义他们的,Timer:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,...

weixin_35714534的博客 244
上一篇: 网络传输协议的七层架构
下一篇: Java中Properties类的操作
THMAIL
博客等级 码龄10年 2434粉丝 432原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值