1. Timer简介

Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。

    

通过创建Timer对象,然后调用Timer的schedule方法,将TimerTask实例作为参数,从而实现定时调度TimerTask(其中TimerTask对象要继承TimerTask对象,复写run方法)。

Timer工具类

    

2.Timer函数的使用

2.1 Timer定时函数 

看参数应该很好理解

    

结合demo进行展示(第四个方法)

step1:new一个TimerTask的子类,重写run方法来指定具体的任务

package com.zang.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask; public class MyTimerTask extends TimerTask{ private String name;
//构造器
public MyTimerTask(String inputName){
name = inputName;
}
//重写run方法,打印当前时间。
@Override
public void run() {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//打印当前文件的内容
System.out.println("Current exec name is " + sdf.format(calendar.getTime()));
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

step2:new一个Timer类,Timer的构造函数里会起一个单独的线程来执行计划任务。

package com.zang.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer; public class MyTimer { public static void main(String[] args) {
//1.创建一个Timer实例
Timer timer = new Timer();
//2.创建一个MyTimerTask实例
MyTimerTask myTimerTask = new MyTimerTask("My First Timer..."); //日期格式化和输出当前时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("current time is " + sdf.format(calendar.getTime())); //3.通过timer定时定频率调用MyTimerTask的业务逻辑
//两秒之后第一次执行,之后每隔一秒执行一次
timer.schedule(myTimerTask, 2000L, 1000L);
}
}

jdk中的代码实现如下:

public Timer() {
this("Timer-" + serialNumber());
} public Timer(String name) {
thread.setName(name);
thread.start();
}

输出如下:

2.2 Timer其他函数(此处不作详解)

TimerTask的cancel()函数的作用:取消当前TimerTask里的任务。

TimerTask的scheduleExecutionTime()作用:返回此任务最近实际执行的已安排执行的时间,返回值:最近发生此任务执行安排的时间,为long型。

Timer对象的cancel()函数的作用:终止此计时器,丢弃所有当前已安排的任务。

Timer的purge()函数的作用:从此计时器的任务队列中移除所有已取消的任务。返回值:从队列中移除的任务数。

 2.3 schedule 和 scheduleAtFixedRate的区别

这两个方法都是任务调度方法,他们之间区别是,schedule会保证任务的间隔是按照定义的period参数严格执行的,如果某一次调度时间比较长,那么后面的时间会顺延保证调度间隔都是period,而scheduleAtFixedRate是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。举个栗子:你每个3秒调度一次,那么正常就是0,3,6,9s这样的时间,如果第二次调度花了2s的时间,如果是schedule,就会变成0,3+2,8,11这样的时间,保证间隔,而scheduleAtFixedRate就会变成0,3+2,6,9,压缩间隔,保证调度时间。即schedule的执行基于上一次的完成时间,  scheduleAtFixedRate的执行基于上一次的开始时间。

3. 综合使用demo

利用Timer控制两个机器人——灌水机器人负责灌水,水满即停止工作;跳舞机器人不负责灌水,水满之后跳舞两秒,停止工作。

创建两个TimerTask的子类,重写run方法来指定具体的任务。

package com.zang.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.TimerTask; public class DancingRobot extends TimerTask{ @Override
public void run() {
//获取最近一次任务执行时间,并将其格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Schedule exec name is " + sdf.format(scheduledExecutionTime()));
System.out.println("I am dacing.... ");
}
}
package com.zang.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask; public class WaterRobot extends TimerTask { private Timer timer;
//水桶的容量,最大容量为5L
private Integer bucketCapacity = 0; public WaterRobot(Timer inputTimer) {
timer = inputTimer;
} @Override
public void run() {
//注水直到水满为止
if(bucketCapacity < 5){
System.out.println("Add 1L water into the bucket.");
bucketCapacity++;
}else{
//水满之后停止
System.out.println("The number of canceled task in timer is(BEFORE) " + timer.purge());
cancel();
System.out.println("The bucket is fulling and the waterRobot has been aborted.");
System.out.println("Current water is "+ bucketCapacity +"L");
//输出被取消的任务数
System.out.println("The number of canceled task in timer is(AFTER) " + timer.purge());
//等待两秒,终止timer里的所有内容
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
timer.cancel();
}
}
}

Timer对象执行任务

package com.zang.timer;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Timer; public class RobotExecutor { public static void main(String[] args) {
Timer timer = new Timer();
//获取当前时间
Calendar calendar = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("Current time is " + sdf.format(calendar.getTime())); DancingRobot dr = new DancingRobot();
WaterRobot wr = new WaterRobot(timer); /*
* 灌水机器人负责灌水,水满即停止工作
* 跳舞机器人不负责灌水,水满之后跳舞两秒,停止工作
*/
timer.schedule(dr, calendar.getTime(), 2000);
timer.schedule(wr, calendar.getTime(), 1000);
}
}

控制台输出:

Timer使用的更多相关文章

  1. C# - 计时器Timer

    System.Timers.Timer 服务器计时器,允许指定在应用程序中引发事件的重复时间间隔. using System.Timers: // 在应用程序中生成定期事件 public class ...

  2. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  3. 【WPF】 Timer与 dispatcherTimer 在wpf中你应该用哪个?

    源:Roboby 1.timer或重复生成timer事件,dispatchertimer是集成到队列中的一个时钟.2.dispatchertimer更适合在wpf中访问UI线程上的元素 3.Dispa ...

  4. STM32F10xxx 之 System tick Timer(SYSTICK Timer)

    背景 研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录. 正文 System tick Timer是Cotex-M内核的24位 ...

  5. 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel

    本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...

  6. WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日

    好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3       0 0     用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...

  7. java Timer 定时每天凌晨1点执行任务

    import java.util.TimerTask;/** * 执行内容 * @author admin_Hzw * */public class Task extends TimerTask {  ...

  8. [C#].NET中几种Timer的使用

    这篇博客将梳理一下.NET中4个Timer类,及其用法. 1. System.Threading.Timer public Timer(TimerCallback callback, object s ...

  9. 使用系统自带的GCD的timer倒计时模板语句遇到的小坑。。

    今天折腾了下系统gcd的 但是如果不调用这句dispatch_source_cancel()那么这个timer根本不工作....解决方法如下: 实现一个倒计时用自带的gcd如此简洁.. 原因可能是如果 ...

  10. C# 定时器 Timers.Timer Forms.Timer

    1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...

随机推荐

  1. 【UOJ #131】【NOI 2015】品酒大会

    http://uoj.ac/problem/131 求出后缀数组和height数组后,从大到小扫相似度进行合并,每次相当于合并两个紧挨着的区间. 合并区间可以用并查集来实现,每个区间的信息都记录在这个 ...

  2. dom操作 属性操作 样式操作

    jQuery DOM操作 1 插入子元素 append('<img>') 插后面 被插入元素调用 appendTo('<img scr="...">') 新 ...

  3. HTTP模块理解(二)

    这是我在写,用express+ajax+swig来做一个简单的应用的时候,遇到的问题.还是不太理解http模块. 后来在网上看到云栖社区的一篇<Node.js之HTTP请求与响应>,这里做 ...

  4. MATLAB/Octave中implicit conversion from real matrix to real scalar错误原因与解决

    写程序时提示 implicit conversion from real matrix to real scalar的一个warning,主要问题在于将一个矩阵当成一个标量在使用.我的程序出现这个wa ...

  5. OpenVPN设置客户端固定IP

    在使用openvpn的过程中,多台客户端连接上同一台openvpn服务器之后,客户端的的IP地扯经常变动,导致客户端之间无法正常通讯,openvpn的版本变动也导致了固定IP地扯的配置不同,用以下方法 ...

  6. Clover 的功能就是给资源管理器加上 Chrome 一样的标签页

    官网下载地址:http://cn.ejie.me/

  7. JavaScript中Object.prototype.toString方法的原理

    在JavaScript中,想要判断某个对象值属于哪种内置类型,最靠谱的做法就是通过Object.prototype.toString方法. ? 1 2 var arr = []; console.lo ...

  8. java gzip压缩与解压

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOExceptio ...

  9. golang解析json格式 -- 全

    项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的. 交互的数据类似如下格式: {"sn":1,"ls" ...

  10. 一份不太简短的LaTeX教程 lshort – A short in­tro­duc­tion to LATEX 2elshort – A short in­tro­duc­tion to LATEX 2e

    Lshort started as a trans­la­tion and ra­tio­nal­i­sa­tion of a ground-break­ing Ger­man-lan­guage i ...