当前位置: 首页 > news >正文

TimerTask(Timer)使用入门

java.util.Timer

java.util.TimerTask

Timer是一种定时器工具,用来在后台计划执行指定任务(过一定时间)。它可以计划执行一个任务一次或反复多次。Timer类是用来执行任务的类,它接受一个TimerTask做参数
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。

1.例题-指定过多久执行任务

import java.util.Timer;
import java.util.TimerTask;

public class Reminder {
    Timer timer;

    public Reminder(int seconds) {
        timer = new Timer();//实例化Timer类,创建计时器后台线程
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {// run方法包含要执行的任务代码
            System.out.println("Time's up!");
            timer.cancel(); //Terminate the timer thread(方法有四种,见下)
        }
    }

    public static void main(String args[]) {
        System.out.println("About to schedule task.");
        new Reminder(5);
        System.out.println("Task scheduled.");
    }
}


运行这个小例子,你会首先看到:
About to schedule task.

Task scheduled
5秒钟之后你会看到:
Time's up!

2.例题-指定任务的执行时间

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 23);
calendar.set(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0);
Date time = calendar.getTime();

timer = new Timer();
timer.schedule(new RemindTask(), time);

3. 终止Timer线程

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

· 调用timercancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer taskrun方法里。

· 让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。 

· 当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。 

· 调用System.exit方法,使整个程序(所有线程)终止。

例题1使用了第一种方式。在这里不能使用第二种方式,因为这里需要程序保持运行直到timer的任务执行完成,如果设成daemon,那么main线程结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。

4. 三个参数的schedule方法

三个参数的schedule方法用来指定task每隔几秒执行一次。如下所列为所有Timer类用来制定计划反复执行task的方法 : 

· schedule(TimerTask task, long delay, long period) 

//在delay时间后开始执行TimerTask对象,执行后每隔period反复执行 

· schedule(TimerTask task, Date time, long period) 

· scheduleAtFixedRate(TimerTask task, long delay, long period) 

· scheduleAtFixedRate(TimerTask task, Date firstTime, long period) 

当计划反复执行的任务时,如果你注重任务执行的平滑度,那么请使用schedule方法,如果你在乎的是任务的执行频度那么使用scheduleAtFixedRate方法。

  使用了schedule方法,这就意味着所有反复执行的任务之间的时间间隔至少为delay秒,也就是说,如果有一个任务因为某种原因迟到了(未按计划执行),那么余下的所有delay都要延时执行。

如果我们想让这个程序正好在3秒以后终止,无论哪一个delay因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个delay迟到时,那么后面的delay就会以最快的速度紧密执行(最大限度的压缩间隔时间)。

假设timer.schedule(new MyTask(), 1000, 2000):1秒钟后,MyTask 执行一次,因为系统繁忙,之后的2.5秒后MyTask 才得以执行第二次,然后,Timer记下了这个延迟,并尝试在下一个任务的时候弥补这个延迟,那么,1.5秒后,MyTask 将执行的三次."以固定的频率而不是固定的延迟时间去执行一个任务"

可参看http://book.51cto.com/art/201112/309619.htm

转载于:https://www.cnblogs.com/tvxqpurpleline/p/3380200.html

相关文章:

  • .net与java建立WebService再互相调用
  • Session的使用与管理
  • 基于Spring可扩展Schema提供自定义配置支持
  • oracle创建job方法
  • java.util.Date转java.sql.Date, 以及区别
  • 记住的小知识点
  • GIServer 2.1 发布,增加新工具,修正中文问题
  • Linux命令全称
  • MyEclipse里面怎样避免光标乱跳
  • ILNumerics项目的应用之线性方程
  • 怎样防止jdk出现版本不一致而导致控制台或Tomcat的出错?
  • Novikoff定理
  • 面试,我薪水要低了——Leo网上答疑45
  • POJ 3253 Fence Repair 优先队列
  • 死机后ie不能执行脚本
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • Apache Spark Streaming 使用实例
  • ESLint简单操作
  • go语言学习初探(一)
  • javascript数组去重/查找/插入/删除
  • JavaScript异步流程控制的前世今生
  • Joomla 2.x, 3.x useful code cheatsheet
  • JS变量作用域
  • JS实现简单的MVC模式开发小游戏
  • laravel 用artisan创建自己的模板
  • magento 货币换算
  • node入门
  • Phpstorm怎样批量删除空行?
  • React-生命周期杂记
  • Webpack 4x 之路 ( 四 )
  • 大快搜索数据爬虫技术实例安装教学篇
  • 高性能JavaScript阅读简记(三)
  • 将回调地狱按在地上摩擦的Promise
  • 算法之不定期更新(一)(2018-04-12)
  • 网络应用优化——时延与带宽
  • 小程序01:wepy框架整合iview webapp UI
  • 移动端唤起键盘时取消position:fixed定位
  • 在weex里面使用chart图表
  • 智能合约开发环境搭建及Hello World合约
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma pack(1)
  • #我与Java虚拟机的故事#连载02:“小蓝”陪伴的日日夜夜
  • $NOIp2018$劝退记
  • (2)(2.10) LTM telemetry
  • (4)事件处理——(7)简单事件(Simple events)
  • (C语言)二分查找 超详细
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (Matalb时序预测)WOA-BP鲸鱼算法优化BP神经网络的多维时序回归预测
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (十一)图像的罗伯特梯度锐化
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...