在这个timerfun函数中去加入这一部分为什么会报错,没太学过匿名类。
你这框里的代码应该写在方法体内,不能在成员位置。你可以将它们写到run方法内。
1、定时器的作用
间隔特定的时间,执行特定的程序。
2、在实际开发中,每隔一定的时间执行一段特定的程序,这种需求是很常见的, 那么在java中其实可以采用多种方式实现。
(1)可以使用Thread.sleep()方法,睡眠,设置好休眠的时间,
在特定的时间醒来,这种方式是最原始的定时器,比较低级。
(2)在java的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。
不过,这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。
(3)目前使用较多的是Spring框架中提供的SpringTask框架。
这个框架只要进行简单的配置,就可以完成定时器的任务。
3、不管是什么框架的定时器,它的实现原理一般都是采用java.util.Timer实现的,所以有必要学习一下Timer这个类。
测试代码:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test12 {
public static void main(String[] args) {
// 创建定时器对象
Timer timer = new Timer();
//Timer timer1 = new Timer(); // 设置成守护线程的方式
// 指定定时任务
//timer.schedule(TimerTask task, Date firestTime, long period); // 三个参数:定时任务,第一次执行时间,间隔的毫秒数
// 先指定第一次执行时间,假设为:2020-7-25 10:17:20
// 获取时间对象
String str = "2020-7-25 10:17:20";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date firstTime = null;
try {
firstTime = sdf.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
// 假设每5秒执行一次
long period = 5 * 1000L;
/*
再来看第一个参数,第一个参数的类型为TimerTask,这是一个抽象类,不能实例化的。
这个TimerTask抽象类已经实现了Runnable接口,是一个线程运行类。
而这个TimerTask抽象类并没有子类,要求我们自己去写一个子类,继承TimerTask类,并重写抽象方法。
*/
// 创建TimeTask对象
TimerTask task = new MyTask();
// 三个参数已经凑齐,开始执行定时任务
timer.schedule(task, firstTime, period);
// 也可以采用匿名内部类,直接new抽象类
/*
timer.schedule(new TimerTask() {
@Override
public void run() {
// 任务代码块
}
}, firstTime, 5000L);
*/
}
}
// 定义一个指定任务的类,继承TimerTask抽象类
class MyTask extends TimerTask {
@Override
public void run() {
Date nowTime = new Date();
System.out.println(Thread.currentThread().getName() + ":" + nowTime);
}
}
运行截图: