Timer使用
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使用的更多相关文章
- C# - 计时器Timer
System.Timers.Timer 服务器计时器,允许指定在应用程序中引发事件的重复时间间隔. using System.Timers: // 在应用程序中生成定期事件 public class ...
- winform 用户控件、 动态创建添加控件、timer控件、控件联动
用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...
- 【WPF】 Timer与 dispatcherTimer 在wpf中你应该用哪个?
源:Roboby 1.timer或重复生成timer事件,dispatchertimer是集成到队列中的一个时钟.2.dispatchertimer更适合在wpf中访问UI线程上的元素 3.Dispa ...
- STM32F10xxx 之 System tick Timer(SYSTICK Timer)
背景 研究STM32F10xxx定时器的时候,无意间看到了System tick Timer,于是比较深入的了解下,在此做个记录. 正文 System tick Timer是Cotex-M内核的24位 ...
- 本地数据Store。Cookie,Session,Cache的理解。Timer类主要用于定时性、周期性任务 的触发。刷新Store,Panel
本地数据Store var monthStore = Ext.create('Ext.data.Store', { storeId : 'monthStore', autoLoad : false, ...
- WinForm用户控件、动态创建添加控件、timer控件--2016年12月12日
好文要顶 关注我 收藏该文 徐淳 关注 - 1 粉丝 - 3 0 0 用户控件: 通过布局将多个控件整合为一个控件,根据自己的需要进行修改,可对用户控件内的所有控件及控件属性进行修 ...
- java Timer 定时每天凌晨1点执行任务
import java.util.TimerTask;/** * 执行内容 * @author admin_Hzw * */public class Task extends TimerTask { ...
- [C#].NET中几种Timer的使用
这篇博客将梳理一下.NET中4个Timer类,及其用法. 1. System.Threading.Timer public Timer(TimerCallback callback, object s ...
- 使用系统自带的GCD的timer倒计时模板语句遇到的小坑。。
今天折腾了下系统gcd的 但是如果不调用这句dispatch_source_cancel()那么这个timer根本不工作....解决方法如下: 实现一个倒计时用自带的gcd如此简洁.. 原因可能是如果 ...
- C# 定时器 Timers.Timer Forms.Timer
1.定义在System.Windows.Forms里 Windows.Forms里面的定时器比较简单,只要把工具箱中的Timer控件拖到窗体上,然后设置一下事件和间隔时间等属性就可以了 //启动定时器 ...
随机推荐
- 初见Python<4>:字典
序列是python中的一种数据结构,映射是另一种.映射(mapping)通过名字来引用值.python内建的唯一一种映射结构是字典.字典中的值没有特殊的顺序,但都存储在一个特定的键中.键可以是数字.字 ...
- POJ 1740 A New Stone Game 又是博弈论配对找规律orz 博弈论 规律
http://poj.org/problem?id=1740 这个博弈一眼看上去很厉害很高大上让人情不自禁觉得自己不会写,结果又是找规律…… 博弈一般后手胜都比较麻烦,但是主要就是找和先手的对应关系, ...
- 【动态规划】POJ1661 Help Jimmy
Help Jimmy Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 11621 Accepted: 3827 Descr ...
- nginx和php-fpm的用户权限
启动php-fpm sudo php-fpm -c /etc/php.ini [17-Sep-2018 00:36:59] ERROR: [pool www] please specify user ...
- Problem I: 零起点学算法104——Yes,I can!
#include<stdio.h> int main() { ]; while(gets(a)!=NULL) { printf("I am "); printf(&qu ...
- PHP5.3魔术方法 __invoke
这个魔幻方法被调用的时机是: 当一个对象当做函数调用的时候, 如果对象定义了__invoke魔幻方法则这个函数会被调用, class Callme { public function __invoke ...
- Codeforces Round #127 (Div. 1) B. Guess That Car! 扫描线
B. Guess That Car! 题目连接: http://codeforces.com/contest/201/problem/B Description A widely known amon ...
- Linux进程(作业)的查看和杀死 牛
http://www.cnblogs.com/geaozhang/p/6910151.html
- java比较客户端版本号
参考文章:http://www.jb51.net/article/70317.htm 关键点 为什么不能使用String.compareTo方法来比较客户端版本号? 举个例子,之前客户端版本号为:9. ...
- windows 配置环境变量快捷方式
在 Windows 设置环境变量 在环境变量中添加软件A的目录: 在命令提示框中(cmd) : 输入 path %path%;C:\A, 按下"Enter". 注意: C:\A是软 ...