Timer类帮助你建立在将来某个时候发生的任务,也包括重复的事件,每个Timer对象都包含一个与之相关联的线程,当它的TimerTask对象中的一个将要运行时,这个线程就被唤醒。

有三种任务调度方式:

  1. 一次性调度(once-only):任务只执行一次;
  2. 固定延时调度(fixed-delay):一次任务完成后再调度下一次的,时间延时是固定的
  3. 固定速率调度(fixed-rate):固定速率调度

一个TimerTask对象只能被一个Timer对象调度,而且被取消的Timer 不能再调度新的任务

例子:创建TimerTask类

Java代码  
  1. import java.util.Date;
  2. import java.util.TimerTask;
  3. /**
  4. * TimerTask类,将需要定时执行的任务写在run()方法中
  5. * */
  6. public class MemoryWatchTask extends TimerTask {
  7. @Override
  8. public void run() {
  9. Runtime run = Runtime.getRuntime();
  10. long free = run.freeMemory();
  11. long total = run.totalMemory();
  12. System.out.println(new Date()+"\t"+free+"\t"+total);
  13. }
  14. }
[java] view plaincopyprint?
  1. import java.util.Date;
  2. import java.util.TimerTask;
  3. /**
  4. * TimerTask类,将需要定时执行的任务写在run()方法中
  5. * */
  6. public class MemoryWatchTask extends TimerTask {
  7. @Override
  8. public void run() {
  9. Runtime run = Runtime.getRuntime();
  10. long free = run.freeMemory();
  11. long total = run.totalMemory();
  12. System.out.println(new Date()+"\t"+free+"\t"+total);
  13. }
  14. }
import java.util.Date;
import java.util.TimerTask;
/*** TimerTask类,将需要定时执行的任务写在run()方法中* */
public class MemoryWatchTask extends TimerTask {@Overridepublic void run() {Runtime run = Runtime.getRuntime();long free = run.freeMemory();long total = run.totalMemory();System.out.println(new Date()+"\t"+free+"\t"+total);}}

对任务类进行定时执行

Java代码  
  1. public static void main(String[] args) {
  2. //如果参数为true,则创建守护线程new Timer(true);
  3. Timer timer = new Timer();
  4. //延时0毫秒后启动,每隔1秒钟执行一次
  5. timer.scheduleAtFixedRate(new MemoryWatchTask(), 0, 1000);
  6. //在指定的时间开始执行第一次,每次间隔1秒钟
  7. //timer.scheduleAtFixedRate(new MemoryWatchTask(), new Date(), 1000);
  8. //在指定的时间进行一次性调度
  9. //timer.schedule(new MemoryWatchTask(), new Date());
  10. //在当前时间延时3秒钟进行一次性调度
  11. //timer.schedule(new MemoryWatchTask(), 3000);
  12. }

Timer与TimerTask是java中比较常用的类,可以定期重复执行某项任务。以前我还不知道这两个类是,一般用Thread来处理,虽然同样可以解决问题,但效率上可能就差了些。既然java内建了这两个类,那就必然有它们的好处了。

顾名思义,Timer应该是个计时器,而TimerTask是需要计时的任务。

下面通过一个小例子看看这两个类是如何让工作的:

Java代码  
  1. import java.util.Date;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class TimerTest extends TimerTask
  5. {
  6. private Timer timer;
  7. public static void main(String[] args)
  8. {
  9. TimerTest timerTest= new TimerTest();
  10. timerTest.timer = new Timer();
  11. //立刻开始执行timerTest任务,只执行一次
  12. timerTest.timer.schedule(timerTest,new Date());
  13. //立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
  14. //timerTest.timer.schedule(timerTest,new Date(),2000);
  15. //一秒钟后开始执行timerTest任务,只执行一次
  16. //timerTest.timer.schedule(timerTest,1000);
  17. //一秒钟后开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
  18. //timerTest.timer.schedule(timerTest,1000,2000);
  19. //立刻开始执行timerTest任务,每隔2秒执行一次
  20. //timerTest.timer.scheduleAtFixedRate(timerTest,new Date(),2000);
  21. //一秒钟后开始执行timerTest任务,每隔2秒执行一次
  22. //timerTest.timer.scheduleAtFixedRate(timerTest,1000,2000);
  23. }
  24. @Override
  25. public void run()
  26. {
  27. System.out.println("Task is running!");
  28. }
  29. }
[java] view plaincopyprint?
  1. import java.util.Date;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class TimerTest extends TimerTask
  5. {
  6. private Timer timer;
  7. public static void main(String[] args)
  8. {
  9. TimerTest timerTest= new TimerTest();
  10. timerTest.timer = new Timer();
  11. //立刻开始执行timerTest任务,只执行一次
  12. timerTest.timer.schedule(timerTest,new Date());
  13. //立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
  14. //timerTest.timer.schedule(timerTest,new Date(),2000);
  15. //一秒钟后开始执行timerTest任务,只执行一次
  16. //timerTest.timer.schedule(timerTest,1000);
  17. //一秒钟后开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
  18. //timerTest.timer.schedule(timerTest,1000,2000);
  19. //立刻开始执行timerTest任务,每隔2秒执行一次
  20. //timerTest.timer.scheduleAtFixedRate(timerTest,new Date(),2000);
  21. //一秒钟后开始执行timerTest任务,每隔2秒执行一次
  22. //timerTest.timer.scheduleAtFixedRate(timerTest,1000,2000);
  23. }
  24. @Override
  25. public void run()
  26. {
  27. System.out.println("Task is running!");
  28. }
  29. }
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TimerTest extends TimerTask
{private Timer timer;public static void main(String[] args){TimerTest timerTest= new TimerTest();timerTest.timer = new Timer();//立刻开始执行timerTest任务,只执行一次timerTest.timer.schedule(timerTest,new Date());//立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次//timerTest.timer.schedule(timerTest,new Date(),2000);//一秒钟后开始执行timerTest任务,只执行一次//timerTest.timer.schedule(timerTest,1000);//一秒钟后开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次//timerTest.timer.schedule(timerTest,1000,2000);//立刻开始执行timerTest任务,每隔2秒执行一次//timerTest.timer.scheduleAtFixedRate(timerTest,new Date(),2000);//一秒钟后开始执行timerTest任务,每隔2秒执行一次//timerTest.timer.scheduleAtFixedRate(timerTest,1000,2000);}@Overridepublic void run(){System.out.println("Task is running!");}
}

需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。上面例子中任务只是打印一个字符串,比较简单。但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行,则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”;而schedule方法的后续执行也将被延迟。所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。

另外,TimerTask的构造函数是protected,所以无法再类中直接new一个TimerTask,而只能写一个类继承TimerTask。

知道了如何执行任务,那么如何终止任务呢?TimerTask与Timer都有cancel()方法。

Java代码  
  1. import java.util.Date;
  2. import java.util.Timer;
  3. import java.util.TimerTask;
  4. public class TimerTest extends TimerTask
  5. {
  6. private Timer timer;
  7. public static void main(String[] args)
  8. {
  9. TimerTest timerTest= new TimerTest();
  10. timerTest.timer = new Timer();
  11. //立刻开始执行timerTest任务,执行完本次任务后,隔2秒再执行一次
  12. timerTest.timer.schedule(timerTest,new Date(),2000);
  13. try
  14. {
  15. Thread.sleep(10000);
  16. } catch (InterruptedException e)
  17. {
  18. e.printStackTrace();
  19. }
  20. //结束任务执行,程序终止
  21. timerTest.timer.cancel();
  22. //结束任务执行,程序并不终止,为什么呢,还没想明白
  23. //timerTest.cancel();
  24. }
  25. @Override
  26. public void run()
  27. {
  28. System.out.println("Task is running!");
  29. }
  30. }

Timer和TimerTask类 例子 .相关推荐

  1. java刷卡计时计次源码美萍_Java 定时调配 Timer 类和定任务 TimerTask 类(一篇详细且完整的源码分析以及四种简单的使用方法)...

    前言 在我们日常生活中,我们常常会遇到有关计时器的事情.如商城类项目会在某年某月某日某时某分某秒进行特价活动,那么当时间到达这个时间点上的时候该事件就会触发. 1.Timer 类构造函数摘要 1 Ti ...

  2. 任务调度之Timer、TimerTask

    老规矩,在进代码之前有必要先把什么是任务调度白话一下,所谓的任务调度指的就是在固定的时间节点开始,以固定或非固定的频率,执行某个动作或行为.        在咱们的日常生活中,任务调度随处可见:比如每 ...

  3. Java 中Timer和TimerTask 定时器和定时任务使用的例子

    转载自  Java 中Timer和TimerTask 定时器和定时任务使用的例子 这两个类使用起来非常方便,可以完成我们对定时器的绝大多数需求 Timer类是用来执行任务的类,它接受一个TimerTa ...

  4. JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 sche

    JDK中的Timer和TimerTask详解 目录结构: Timer和TimerTask 一个Timer调度的例子 如何终止Timer线程 关于cancle方式终止线程 反复执行一个任务 schedu ...

  5. [ImportNew]Java中的Timer类和TimerTask类

    http://www.importnew.com/9978.html java.util.Timer是一个实用工具类,该类用来调度一个线程,使它可以在将来某一时刻执行. Java的Timer类可以调度 ...

  6. Timer类 和 TimerTask类。一种有用计时器工具。可以每隔相同时间去执行某任务一次。

    1,编写一个类 继承TimerTask类 public class MyTimerTask extends TimerTask {@Overridepublic void run() {System. ...

  7. Timer和TimerTask

    Timer和TimerTask 在项目中偶然间看到通过这个方式实现的计时功能,所以想适当地进行归纳和总结 虽然说是总结,但是还是参考了下述文档: http://blog.csdn.net/ahxu/a ...

  8. java线程中的task_Java线程(四):Timer和TimerTask

    Timer和TimerTask可以做为实现线程的第三种方式,前两中方式分别是继承自Thread类和实现Runnable接口. Timer是一种线程设施,用于安排以后在后台线程中执行的任务.可安排任务执 ...

  9. Java Timer、TimerTask

    下面内容转载自: http://blog.csdn.net/xieyuooo/article/details/8607220 其实就Timer来讲就是一个调度器,而TimerTask呢只是一个实现了r ...

最新文章

  1. 某程序员吐槽:提离职后领导开始演戏,假装不知道我工资低,对我进行挽留,怎么办?...
  2. 关于卡巴斯基部分激活问题的解决方案
  3. ITIL的一些简单感受
  4. java-初识JVM的内存分配(5个区域)概念--系列(一)
  5. java中io.nio.aio_Java中网络IO的实现方式-BIO、NIO、AIO
  6. VS2013显示行号及显示程序汇编代码
  7. Java文件流的原理与应用
  8. Ubuntu20.04基本配置和常见问题(vmwareTools配置、换源、网卡配置)
  9. 利用nat123进行内网穿透
  10. 使用代码控制小米智能插座
  11. 混沌时间序列的 rbf 预测
  12. 使用GF集进行构型综合的方法之总结
  13. linux发行版本排行,2020年10种最受欢迎的Linux发行版排名
  14. HAUT OJ 1231: ykc买零食
  15. 赛场计算机配置要求,S9 世界赛打响 啥配置的电脑才能进决赛?
  16. 如何解决令人头痛的DCOM配置问题
  17. 转:设一个“阿甘奖”,认真为“傻瓜”鼓掌
  18. mysql gb2312转utf8_如何把数据从GB2312转换成UTF-8
  19. 用户登录成功后的操作
  20. 美图秀秀笔试题:妖怪与和尚过河问题答案

热门文章

  1. TCP建立连接三次握手及其断开过程
  2. 人工智能中的局部搜索算法
  3. Python+Selenium WebDriver API:浏览器及元素的常用函数及变量整理总结
  4. 转【FullPage.js 应用参数参考与简单调用】
  5. Flexbox兼容性语法汇总
  6. Oracle数据库 ORA-01555 快照过旧 (undo表空间:撤销表空间)
  7. MySQL学习笔记7:基本查询
  8. 错误HIERARCHY_REQUEST_ERR: DOM Exception 3
  9. 如何知道iframe文件下载download完成
  10. php this指针的用法,C#_C#中this指针的用法示例,本文实例展示了C#中this指针的 - phpStudy...