详解 定时器

(请观看本人博文 —— 《详解 多线程》

shadowLogo

概述:

定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务 通过 后台线程的方式执行
在Java中,可以通过 Timer类TimerTask类 来实现定义调度的功能。

那么,本文对这两个类进行讲解


首先是 Timer类

Timer类:

概述:

线程的一个组件,为在后台线程中的未来执行调度任务。
任务可能被安排为一次性执行,或定期重复执行


那么,现在,本人来展示下这个类的 构造方法

构造方法:

  • Timer()
    创建一个新的计时器
  • Timer(boolean isDaemon)
    创建一个新的定时器的线程可以被指定 run as a daemon
  • Timer(String name)
    创建一个新的计时器,该计时器的关联线程具有指定的名称
  • Timer(String name, boolean isDaemon)
    创建一个新的定时器的相关线程指定名称,可以指定 run as a daemon

现在,本人来展示下这个类的 常用API

常用API:

  • void cancel()
    终止此计时器丢弃任何当前计划的任务
  • int purge()
    这个计时器的任务队列移除所有已取消的任务
  • void schedule(TimerTask task, Date time)
    指定的时间计划执行指定的任务
  • void schedule(TimerTask task, Date firstTime, long period)
    计划重复固定延迟执行指定的任务开始在指定的时
  • void schedule(TimerTask task, long delay)
    指定在指定的延迟后执行指定的任务的时间
  • void schedule(TimerTask task, long delay, long period)
    计划重复固定延迟执行指定的任务,在指定的延迟后开始
  • void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
    计划重复固定利率执行指定的任务,开始在指定的时间
  • void scheduleAtFixedRate(TimerTask task, long delay, long period)
    计划重复固定利率执行指定的任务,在指定的延迟 后开始

由于 Timer类的对象必须要一个 TimerTask类的对象,才能使用,所以,本人在讲解完 TimerTask类后再来展示这两个类的使用。


那么,现在,本人来讲解下 TimerTask类

TimerTask类:

概述:

可以由定时器 一次性重复 执行的任务


构造方法:

  • protected TimerTask():
    创建一个新的计时器任务

常用API:

  • boolean cancel()
    取消此计时器任务
  • abstract void run()
    此计时器任务执行的动作
  • long scheduledExecutionTime()
    返回该任务的最新实际的执行预定执行时间

那么,现在,本人来通过两个例子,来展示下这两个类的使用:

应用展示:

例1:

题目:

这天高木同学又有了戏耍西片同学的主意:
她提出要和西片同学比细心 —— 用电脑计时,两个人互相数6.66s,时间到了就要向对方发送“时间到了呦~”,谁最靠近6.66s,谁就赢了
西片同学一听就乐了,细心,不正是西片同学最擅长的嘛,于是就和高木同学定下赌约。而高木同学已经想好了用一套代码来计时,那么,同学们,你们知道这套代码的大致思路吗?


要求:

编写一套代码,每隔6.66s,让控制台输出字符串"时间到了呦~",一共输出5次


那么,本人来展示下代码:

代码实现:

首先是 自定义定时器任务类

package edu.youzg.about_timer.core;

import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    Timer timer;
    static int count = 0;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }

    @Override
    public void run() {
        if (count++ < 5) {
            System.out.println("时间到了呦~");
        } else {
            timer.cancel();
        }
    }

}

现在,本人来给出测试类

package edu.youzg.about_timer.core;

import java.util.Timer;

public class Test {
    
    public static void main(String[] args){
        Timer timer = new Timer();
        //延迟6660毫秒之后,让定时任务执行,每隔6660毫秒执行一次
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        timer.schedule(myTimerTask,6660, 6660);
    }

}

现在,本人来展示下运行结果
在这里插入图片描述
由于本人没录视频,所以只能展示结束后的运行结果,若是抱有怀疑的同学自己运行下上面的代码即可!


例2:

题目:

每年2.14号是情人节,王小明和小樱不再一座城市,但是想在当地2.14号的0:00给小樱说声“桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します”,但是害羞的他怕到时候纠结。

要求:

编写一套程序,在编译后,当时间到指定日期的指定时刻从控制台输出字符串"桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します".


代码实现:

首先,本人来给出一个 自定义定时器任务类

package edu.youzg.about_timer.core;

import java.util.Timer;
import java.util.TimerTask;

public class MyTimerTask extends TimerTask {
    Timer timer;
    public MyTimerTask(Timer timer) {
        this.timer=timer;
    }
    @Override
    public void run() {
        System.out.println("桜、バレンタインデーの楽しみ、私は永遠にあなたを愛します");
        timer.cancel();//取消定时器
    }

}

现在,本人来给出一个测试类

package edu.youzg.about_timer.core;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;

public class Test {

    public static void main(String[] args) throws ParseException {
        Timer timer = new Timer();
        String dateStr = "2020-02-16 21:11:00"; //由于2.14已经过了,本人要是等的话,就到明年了,所以,就自己设置了一个合理的时间
        Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateStr);
        MyTimerTask myTimerTask = new MyTimerTask(timer);
        timer.schedule(myTimerTask,date);
    }

}

首先,本人来展示下时间:
在这里插入图片描述
现在,本人来展示下这一时刻控制台的状态:
在这里插入图片描述
可以看到,在本人指定的时间输出了指定的结果!


那么,想要了解底层源码实现的同学,可以观看如下博文:

源码剖析:

请观看博文 —— 《【源码剖析】定时器 详解》


那么,至此,定时器的相关知识点就讲解完毕了!
本人也在后续博文中,自己实现了定时器 —— 《详解 定时器 的基本实现》
希望同学们能有所启发!


(本人 《详解 多线程》 博文 链接:https:////www.cnblogs.com/codderYouzg/p/12418935.html

posted @ 2020-03-05 10:58  在下右转,有何贵干  阅读(316)  评论(0编辑  收藏  举报