【Java学习】Timer用法
来源:互联网 发布:python contain 编辑:程序博客网 时间:2024/06/05 20:06
java.util.Timer
在线JDK文档:http://tool.oschina.net/apidocs/apidoc?api=jdk_7u4
定义:有且仅有一个后台线程,对多个业务线程进行定时定频率的调度。
简单例子:
创建一个MyTimerTask类,重写其中的run方法
package com.imooc.timer;import java.util.TimerTask;public class MyTimerTask extends TimerTask { private String name; public MyTimerTask(String inputName) { name = inputName; } @Override public void run() { // 打印当前name的内容 System.out.println("Current exec name is " + name); } public String getName() { return name; } public void setName(String name) { this.name = name; }}
创建一个MyTimer类,创建main函数调用MyTimerTask中的run方法:
package com.imooc.timer;import java.util.Timer;public class MyTimer { public static void main(String[] args) { //创建一个Timer实例 Timer timer = new Timer(); //创建一个MyTimerTask实例 MyTimerTask myTask = new MyTimerTask("No 1"); //通过timer定时定频率调用myTimerTask的业务逻辑 // 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次 timer.schedule(myTask, 2000L, 1000L); }}
详解:
schedule四种用法:
1、schedule(task,time)
task所要安排的任务
time首次执行任务的时间
作用:在时间等于或超过time的时候执行且只执行一次task(即在规定时间执行task)
上面run()方法改为: @Override public void run() { Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("current exec time is" + sf.format(calendar.getTime())); // 打印当前name的内容 System.out.println("Current exec name is " + name); }
main函数改为:
public static void main(String[] args) { //创建一个Timer实例 Timer timer = new Timer(); //创建一个MyTimerTask实例 MyTimerTask myTask = new MyTimerTask("No 1"); //通过timer定时定频率调用myTimerTask的业务逻辑 // 即第一次执行是在当前时间的两秒钟之后,之后每隔一秒钟执行一次// timer.schedule(myTask, 2000L, 1000L); Calendar calendar = Calendar.getInstance(); SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(sf.format(calendar.getTime())); calendar.add(Calendar.SECOND, 3); myTask.setName("schedule1"); timer.schedule(myTask, calendar.getTime()); }
2、schedule(task,time,period)
前两个参数与第一种相同
task所要安排的任务
time首次执行任务的时间
period执行一次task的时间间隔,单位为毫秒
作用:在时间等于或超过time的时候首次执行task,之后每隔period毫秒重复执行一次task
基本同第一种方式,只是把schedule中多加一个参数timer.schedule(myTask, calendar.getTime(), 2000)
3、schedule(task, delay)
task所要安排的任务
delay执行任务前的延迟时间,单位为毫秒
myTask.setName("schedule3");timer.schedule(myTask, 1000);
4、schedule(task,delay,period)
myTask.setName("schedule3");timer.schedule(myTask, 3000,2000);
Timer类中除了有schedule方法,还有一个scheduleAtFixedRate方法,其有两种用法
1、scheduleAtFixedRate(task, time, period);//基本同schedule第二种用法
2、scheduleAtFixedRate(task, delay, period);//基本同schedule第四种用法
schedule方法和scheduleAtFixedRate方法区别:
分两种情况:
① 首次计划执行的时间早于当前的时间
schedule方法:“fixed-delay”,如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完成的时间点进行计算
scheduleAtFixedRate方法:“fixed-rate”,如果第一次执行时间被delay了,随后的执行时间按照上一次开始的时间点进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步
②任务执行所需时间超出任务的执行周期间隔
schedule方法:下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后
scheduleAtFixedRate方法:下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性
Timer天生缺陷:
① 管理并发任务的缺陷
Timer有且仅有一个线程去执行定时任务,如果存在多个任务,切任务时间过长,会导致执行效果与预期不符
② 当任务抛出异常时的缺陷
如果TimerTask抛出RuntimeException,Timer会停止所有任务的运行
- JAVA TIMER用法学习
- JAVA TIMER用法学习
- JAVA TIMER用法学习
- JAVA TIMER用法学习
- JAVA TIMER用法学习
- 【Java学习】Timer用法
- java timer的用法
- Java-Timer简单用法
- Java之Timer用法
- JAVA timer.schedule用法
- Java学习 Timer类
- java Timer 学习
- java Timer学习笔记
- java Timer学习笔记
- Java中Timer的用法
- java Timer定时器的用法
- java中Timer的用法
- Java中Timer的用法
- UGUI CanvasGroup
- 深入JVM锁机制1-synchronized
- cmd操作mysql的常用命令
- 属性动画(上)
- QTableWidget 应用总结
- 【Java学习】Timer用法
- JMeter学习笔记--使用HTTP信息头管理器
- 构建jsp运行环境
- 网络编程的一般步骤
- bzoj2023
- eclipse注释模板设置
- HttpRequest中常见的四种ContentType【转载】
- vim显示不可见特殊字符
- Java并发之AQS