TimerTask和Timer类用于设置定时任务,实质上用的是Thread,为了加深理解,所以打算自己写一个。
定时任务:其实理解起来,就是一个线程一直在阻塞着(wait),然后当设置的时间到了,notify一下,执行这个阻塞的线程。按照这个思路,来写一个最简单的定时任务。
public class MyTimerTask implements Runnable{
private Object lock;
public MyTimerTask(Object lock){
super();
this.lock = lock;
}
@Override
public void run(){
synchronized(lock){
lock.wait();
System.out.println("Now it is time.")
}
}
}
首先建立MyTimerTask类来表示要执行的任务。
run方法中先获取lock的对象锁,然后调用lock.wait()方法来阻塞线程,等待被通知或者中断,同时释放锁。
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main {
public static void main(String[] args) throws Exception{
Object lock = new Object();
MyTimerTask myTask = new MyTimerTask(lock);
new Thread(myTask).start();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String planDateStr = "2019-05-08 15:45:00";
Date planDate = sdf.parse(planDateStr);//计划执行时间
while(true){
synchronized (lock){
long curTime = System.currentTimeMillis();
if(planDate.getTime() <= curTime){
lock.notify();
return;
}
}
}
}
}
如上所示,首先新建一个lock对象,开启MyTimertask线程,并通过lock.wait()来阻塞。然后在main线程里,循环判断当前时间是不是大于计划时间,计划时间到了的时候,通过lock.notify()来通知阻塞线程。这样一个简易版的定时器就完成了。