学习java多线程的笔记2--Timer类与TimerTask类的使用

时间:2021-02-10 00:12:39

今天看了《传智播客_张孝祥_Java多线程与并发库高级应用视频教程》第二讲,只要讲了定时器Timer与TimerTask类的使用

其中有一种使用方案:

见代码:

package cn.yang.thread;

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

public class ThreadTimer {

private static int DELAY=1000;
private static int PERIOD=2000;
/**
* 定时器的使用
* @param args
*/
public static void main(String[] args) {
twoTimer2();
}
/**
* 重复新建定时器
*/
private static void twoTimer2(){

// void schedule(TimerTask task, long delay, long period)
//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
new Timer().schedule(new MyTimerTask(), DELAY);
while(true){
System.out.println(new Date().getSeconds());
try{
Thread.sleep(1000);
}catch(InterruptedException e){

}
}
}

static class MyTimerTask extends TimerTask{

@Override
public void run() {
count=(count+1)%2;
System.out.println("MyTimerTask-->helloWorld!"+count);
new Timer().schedule(new MyTimerTask(), 1000+1000*count);
}

}
private static int count = 0;
}

上面代码中:

new Timer().schedule(new MyTimerTask(), DELAY);

其中的new MyTimerTask(),MyTimerTask是一个内部类


static class   MyTimerTask extends TimerTask{

@Override
public void run() {
count=(count+1)%2;
System.out.println("MyTimerTask-->helloWorld!"+count);
new Timer().schedule(new MyTimerTask(), 1000+1000*count);
}

}

由于要在main(.)方法中使用MyTimerTask内部类,所以将其声明为 static class MyTimerTask....

在MyTimerTask内部类中的run()方法,有一句:

new Timer().schedule(new MyTimerTask(), 1000+1000*count);
表示新安排一个任务,即
new MyTimerTask()//....
这样就可以实现重复使用定时器了,但要注意MyTimerTask内部类的使用,像下面那样就不行了,会报错: Error:Task already scheduled or cancelled

这样的代码如下:

private static void twoTimer(){
// void schedule(TimerTask task, long delay, long period)
//安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。
new Timer().schedule(new TimerTask() {

@Override
public void run() {
System.out.println("helloWorld!");
//1、再新建一个定时器,不过是使用自身 this,
//Error:Task already scheduled or cancelled
//Task已经被使用
new Timer().schedule(this, DELAY);
}
},DELAY,PERIOD);


while(true){
System.out.println(new Date().getSeconds());
try{
Thread.sleep(1000);
}catch(InterruptedException e){

}
}
}

所以,上面是使用定时器Timer类和TimerTask类的一些要注意的问题

每天都要进步才行!加油....

很感谢张老师的java视频教程,可惜他不在世界上了,但还有很多他站起来的!