在某些应用场合,需要定时地完成一些操作,希望能有一个“精准”的定时的工具,方便编程。
应该有一个线程,这个线程每经过一段时间(这个时间可以指定),就“醒来”,并执行外部要求完成的操作。
作为一个定时器,需要定义一个时延,即要求等待的时间delay;
需要用线程来实现该定时器,便需要一个变量来控制线程goon;
既然存在线程,必然要给两个方法,开启线程start(),关闭线程stop();
定时器要应用在某些场合来做一些其他事情,那么就需要一个方法来负责做某些事,但是由于现在无法获悉未来要做什么,所以给一个抽象方法doing(),未来由其他类来实现该方法。
public abstract class SimpleDidaDida implements Runnable {
public static final long DEFAULT_DELAY=1000;//默认时延
private long delay;//时延
private volatile boolean goon;//便于控制线程
private Object lock;//确保可以精准等待,给一个对象锁,wait()等基于该锁
//初始化时允许用户指定等待时间,若不指定,则使用默认时延
public SimpleDidaDida() {
this(DEFAULT_DELAY);//调用单参构造
}
public SimpleDidaDida(long delay) {
this.lock = new Object();//初始化对象锁
this.delay = delay;
}
//具体完成的事情不由该类实现
public abstract void doing();
//启动线程
public void start() {
if(this.goon == true) {
return;
}
this.goon = true;
new Thread(this).start();
}
//停止线程,当线程等待执行完doing后,goon==false时
public void stop() {
if(this.goon == false) {
return;
}
this.goon = false;//说明线程运行完毕
}
@Override
public void run() {
while(goon) {
synchronized(lock) {
try {
//当前线程暂停执行,即处于等待状态,并释放对象锁;
//当超过delay或执行notify/notifyAll()方法,该线程会被唤醒
lock.wait(delay);
doing();//调用抽象方法
} catch (InterruptedException e) {
goon = false;
}
}