• 详解 定时器


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



    定时器

    概述:

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

  • 相关阅读:
    PAT 1017 Queueing at Bank
    一句有意思的代码
    PAT 1031 Hello World for U
    PAT 1024 Palindromic Number
    PAT 1032 Sharing
    各显神通
    ZJU PAT 1023
    静夜,乱思
    PAT 1024 Palindromic Number
    虚函数表
  • 原文地址:https://www.cnblogs.com/codderYouzg/p/12418998.html
Copyright © 2020-2023  润新知