首页 > 其他 > 详细

详解 定时器

时间:2020-03-05 11:56:55      阅读:76      评论:0      收藏:0      [点我收藏+]

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



定时器

概述:

定时器是一个应用十分广泛的线程工具,可用于调度多个定时任务 通过 后台线程的方式执行
在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

详解 定时器

原文:https://www.cnblogs.com/codderYouzg/p/12418998.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!