关于Timer和TimerTask
来源:才华咖 本文已影响1.31W人
来源:才华咖 本文已影响1.31W人
Timer 功能在指定的时间间隔内反复触发指定窗口的定时器事件。下面yjbys小编为大家准备了关于Timer和TimerTask的文章,欢迎阅读。
1.概览
Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。
TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。
简单的一个例程:
import r;
import rTask;
/**
* Simple demo that uses r to schedule a task to execute
* once 5 seconds have passed.
*/
public class Reminder {
Timer timer;
public Reminder(int seconds) {
timer = new Timer();
dule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
tln("Time's up!");
el(); //Terminate the timer thread
}
}
public static void main(String args[]) {
tln("About to schedule task.");
new Reminder(5);
tln("Task scheduled.");
}
}
运行这个小例子,你会首先看到:
About to schedule task.
5秒钟之后你会看到:
Time's up!
这个小例子可以说明一些用Timer线程实现和计划执行一个任务的基础步骤:
实现自定义的TimerTask的子类,run方法包含要执行的任务代码,在这个例子里,这个子类就是RemindTask。
实例化Timer类,创建计时器后台线程。
实例化任务对象 (new RemindTask()).
制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间(单位是milliseconds,这里定义了5000)。还有一种方法可以指定任务的执行时间,如下例,指定任务在11:01 p.m.执行:
//Get the Date corresponding to 11:01:00 pm today.
Calendar calendar = nstance();
(_OF_DAY, 23);
(TE, 1);
(ND, 0);
Date time = ime();
timer = new Timer();
dule(new RemindTask(), time);
2.终止Timer线程
默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:
调用timer的cancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer task的run方法里。
让timer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。
当timer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。
调用方法,使整个程序(所有线程)终止。
Reminder的例子使用了第一种方式。在这里不能使用第二种方式,因为这里需要程序保持运行直到timer的任务执行完成,如果设成daemon,那么当main线程结束的时候,程序只剩下timer这个daemon线程,于是程序不会等timer线程执行task就终止了。
有些时候,程序的终止与否并不只与timer线程有关。举个例子,如果我们使用AWT来beep,那么AWT会自动创建一个非daemon线程来保持程序的运行。
import r;
import rTask;
import kit;
/**
* Simple demo that uses r to schedule a task to execute
* once 5 seconds have passed.
*/
public class ReminderBeep {
Toolkit toolkit;
Timer timer;
public ReminderBeep(int seconds) {
toolkit = efaultToolkit();
timer = new Timer();
dule(new RemindTask(), seconds*1000);
}
class RemindTask extends TimerTask {
public void run() {
tln("Time's up!");
();
//el(); //Not necessary because we call
(0); //Stops the AWT thread (and everything else)
}
}
public static void main(String args[]) {
tln("About to schedule task.");
new ReminderBeep(5);
tln("Task scheduled.");
}
}
3.反复执行一个任务
先看一个例子:
public class AnnoyingBeep {
Toolkit toolkit;
Timer timer;
public AnnoyingBeep() {
toolkit = efaultToolkit();
timer = new Timer();
dule(new RemindTask(),
0, //initial delay
1*1000); //subsequent rate
}
class RemindTask extends TimerTask {
int numWarningBeeps = 3;
public void run() {
if (numWarningBeeps > 0) {
();
tln("Beep!");
numWarningBeeps--;
} else {
();
tln("Time's up!");
//el(); //Not necessary because we call
(0); //Stops the AWT thread (and everything else)
}
}
}
...
}
执行,你会看到如下输出:
Task scheduled.
Beep!
Beep! //one second after the first beep
Beep! //one second after the second beep
Time's up! //one second after the third beep
这里使用了三个参数的'schedule方法用来指定task每隔一秒执行一次。如下所列为所有Timer类用来制定计划反复执行task的方法 :
schedule(TimerTask task, long delay, long 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方法,这就意味着所有beep之间的时间间隔至少为1秒,也就是说,如果有一个beap因为某种原因迟到了(未按计划执行),那么余下的所有beep都要延时执行。如果我们想让这个程序正好在3秒以后终止,无论哪一个beep因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个beep迟到时,那么后面的beep就会以最快的速度紧密执行(最大限度的压缩间隔时间)。
4.进一步分析schedule和scheduleAtFixedRate
(1)2个参数的schedule在制定任务计划时, 如果指定的计划执行时间scheduledExecutionTime<=systemCurrentTime,则task会被立即执行。scheduledExecutionTime不会因为某一个task的过度执行而改变。
(2)3个参数的schedule在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间随着前一次的实际执行时间而变,也就是scheduledExecutionTime(第n+1次)=realExecutionTime(第n次)+periodTime。也就是说如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做时隔等待,立即执行第n+1次task,而接下来的第n+2次task的scheduledExecutionTime(第n+2次)就随着变成了realExecutionTime(第n+1次)+periodTime。说白了,这个方法更注重保持间隔时间的稳定。
(3)3个参数的scheduleAtFixedRate在制定反复执行一个task的计划时,每一次执行这个task的计划执行时间在最初就被定下来了,也就是scheduledExecutionTime(第n次)=firstExecuteTime+n*periodTime;如果第n次执行task时,由于某种原因这次执行时间过长,执行完后的systemCurrentTime>=scheduledExecutionTime(第n+1次),则此时不做period间隔等待,立即执行第n+1次task,而接下来的第n+2次的task的scheduledExecutionTime(第n+2次)依然还是firstExecuteTime+(n+2)*periodTime这在第一次执行task就定下来了。说白了,这个方法更注重保持执行频率的稳定。
5.一些注意的问题
每一个Timer仅对应唯一一个线程。
Timer不保证任务执行的十分精确。
Timer类的线程安全的。
At Climate Summit, Hope for Emissions Deal美文欣赏
英语作文:The Merits of Computer Games
Cortana makes a timid debut in Skype
MS SQL Server Management Studio Express安装图文具体步骤
英语日常口语Unit14:Tim strikes it rich
六年级英语上册Unit2 New York is in the east of America说课稿
should women work after getting married英语作文
初中英语作文To Bea Computer Expert Is My Ideal
英语阅读:African Union Leaders Talk Mali, Chinese Investmen
英语阅读:VIT declines to acquire Ang Mo Kio property
A Letter to the University President为题目的作文
《the most interesting stories》湘少版六下Unit7的相关知识及
六下英语Unit5Ourearthlookslikethisfromspace教案
Remarks by President Bush at CEO Summit
My favourite supermarket英语作文
中考英语阅读理解答案A report from the United Nations
关于柔和造句
The Importance of Breakfast英语作文
The first day of term begins英语作文
初中英语写作范文:My Happy Times During Winter Vacation
Time To Stop Worrying About Invasive Species美文欣赏
How to make a fruit platter英语作文
Module 7 Travel Unit 2 We are going to visit the Ming Tombs
Unit 5 What are the shirts made of说课稿范文
I Can’t Wait For Summer to Come英语作文
Unit4 Where is my car ? Part A 教学反思
RemarksofPresidentBarackObama优秀英语作文
Miss Australia wins Miss Universe title英语美文
My Happy Times During Winter Vacation初中英语作文
Module 6 Unit 1 I went there last year教学反思
关于Timer和TimerTask
Efforts Urged to Improve Womens Reproductive Health英语阅读
关于颐和园导游词
英语作文: A letter to my sister
The Role of Migrant Workers英语作文
九年级《unit 6 I like music that I can dance to. Period2》评课稿
外研一起2A M2 Unit 2 He doesnt like this shirt的优秀教案
Passage Eighteen (Strictly Ban smoking)英语阅读理解
关于和平和战争主题演讲稿
I my borther and my sister初中英语作文