Timer有两种执行任务的模式最常用的是schedule它可以以两种方式执行任务::在某个时间(Data):在某个固定的时间之后(int delay)这两种方式都可以指定任务执行的频率看个简单的例子:
复制代码 代码如下:
import java
io
IOException;
import java
util
Timer;
public class TimerTest {
public static void main(String[] args){
Timer timer = new Timer();
timerschedule(new MyTask() );//在秒后执行此任务每次间隔秒如果传递一个Data参数就可以在某个固定的时间执行这个任务
while(true){//这个是用来停止此任务的否则就一直循环执行此任务了
try {
int ch = Systeminread();
if(chc==){
timercancel();//使用这个方法退出任务
}
} catch (IOException e) {
// TODO Autogenerated catch block
eprintStackTrace();
}
}
}
static class MyTask extends javautilTimerTask{
@Override
public void run() {
// TODO Autogenerated method stub
Systemoutprintln("________");
}
}
}
如果你使用的是JDK +还有一个scheduleAtFixedRate模 式可以用在这个模式下Timer会尽量的让任务在一个固定的频率下运行举例说明:在上面的例子中我们想让MyTask在秒钟后每两秒钟执行一 次但是因为java不是实时的(其实java实时性很差)所以我们在上个程序中表达的原义并不能够严格执行如果我们调用的是 scheduleAtFixedRate那么Timer会尽量让你的Task执行的频率保持在秒一次运行上面的程序假设使用的是 scheduleAtFixedRate那么下面的场景就是可能的:秒钟后MyTask 执行一次因为系统繁忙之后的秒后MyTask 才得以执行第二次然后Timer记下了这个延迟并尝试在下一个任务的时候弥补这个延迟那么秒后MyTask 将执行的三次"以固定的频率而不是固定的延迟时间去执行一个任务"
下面给出一个复杂点的例子其中告诉大家怎么退出单个TimerTask怎么退出所有Task
复制代码 代码如下:
package MyTimerTest;
import javaioIOException;
import javautilTimer;
/*
* 本类给出了使用Timer和TimerTaske的主要方法其中包括定制任务添加任务
* 退出任务退出定时器
* 因为TimerTask的status域是包级可访问的所以没有办法在javautil包外
* 得到其状态这对编程造成一些不便 我们不能判断某个Task的状态了
*
*/
public class TimerTest {
public static void main(String[] args) {
Timer timer = new Timer();
MyTask myTask = new MyTask();
MyTask myTask = new MyTask();
myTasksetInfo("myTask");
timerschedule(myTask );
timerscheduleAtFixedRate(myTask );
while (true) {
try {
byte[] info = new byte[];
int len = Systeminread(info);
String strInfo = new String(info len "GBK");//从控制台读出信息
if (strInfocharAt(strInfolength() ) == ) {
strInfo = strInfosubstring( strInfolength() );
}
if (strInfostartsWith("Cancel")) { myTaskcancel();//退出单个任务
// 其实应该在这里判断myTask是否也退出了是的话就应该break但是因为无法在包外得到
// myTask的状态所以这里不能做出是否退出循环的判断
} else if (strInfostartsWith("Cancel")) {
myTaskcancel();
} else if (strInfostartsWith("CancelAll")) {
timercancel();//退出Timer
break;
} else {
// 只对myTask作出判断偷个懒^_^
myTasksetInfo(strInfo);
}
} catch (IOException e) { // TODO Autogenerated catch block
eprintStackTrace();
}
}
}
static class MyTask extends javautilTimerTask {
String info = "^_^";
@Override
public void run() {
// TODO Autogenerated method stub
Systemoutprintln(info);
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
thisinfo = info;
}
}