定时器类。现在什么都是自动化的,如空调、电视、洗衣机等等。都要用
到定时器这个
类。对了,还有定时炸弹也要用它。那我们可不可以只写一个定时器类,应用到所有的需要
定时器的设备
上呢?答案是肯定的,我们需要这个类。
好了,我们来分析一下定时器需要完成什么工作吧。定时器应该有启动、停止方法。定时器
启动之后,每
过一定时间就执行某个动作。
其中时间间隔为
long
型,
而要执行的动作可能是输出一个字符
串,也可能是
打印作业。具体要干什么由使用定时器的用户来完成。而定义定时器时,根本就不知道要干
什么。
public class Timmer {
private long time;
private Action action;
public Timmer() {}
public Timmer(long time, Action action) {
this.time = time;
this.action = action;
}
public void start() {
state = START;
if(th == null) {
th = new Thread() {
public void run() {
while(state == START) {
try {
Thread.sleep(time);
action.action();
} catch(Exception e) {
}
}
}
};
}
th.start();
}
public void stop() {
state = STOP;
}
public void setTime(long time) {
this.time = time;
}
public void setAction(Action action) {
this.action = action;
}
public long getTime() {
return (this.time);
}
public Action getAction() {
return (this.action);
}
}
Action是一个接口,它只有一个方法,就是要完成的任务。我们在定时器启动时调用这个接
口的方法。而这个Action接口的对象,代表一个动作,这个动作就是用户要完成的动作。
public interface Action {
public void action();
}
public static void main(String[] args) {
Timer t = new Timer(2000, new Action() {
public void action() {
System.out.println("Hello World!");
}
});
t.start();
javax.swing.JOptionPane.showMessageDialog(null, "点击确定按钮停止定时器");
t.stop();
System.exit(0);
}
这是一个典型的回调方法例子。在AWT中,java使用了大量的监听器。这些监听器都是回调方法。在XML解析器
SAX中,也使用了回调方法来解析XML文档。
接口要比抽象类还要抽象。抽象类需要子类继承,而Java是单继承,所以抽象类被限制了。
而接口不同,一个类可以实现多个接口。好比人类与程序员类之间的关系。可以说程序员是人类的子类,
如果程序员是一个接口。用人类的子类来实现它就会更好。这个子类还可以去实现会计接口、音乐家接口
等等。
在struts2.0、spring、hibernate等框架中,都大量使用接口。
我们关心的是某个接口与另一个接口之间的关系。而不关心某个实现类与另一个接口实现类的关系。在客观世界中,我们交谈时都大
量使用接口,只是我们没有注意罢了。如:我公司需要一个程序员(一个实现了程序员接口的对象)。
上课时,讲师有一台计算机,用白板笔在白板上写字(计算机是接口,白板及白板笔也是接口)
。讲师希望学生能学会所有的知识(讲师及学生都是接口)。
到定时器这个
类。对了,还有定时炸弹也要用它。那我们可不可以只写一个定时器类,应用到所有的需要
定时器的设备
上呢?答案是肯定的,我们需要这个类。
好了,我们来分析一下定时器需要完成什么工作吧。定时器应该有启动、停止方法。定时器
启动之后,每
过一定时间就执行某个动作。
其中时间间隔为
long
型,
而要执行的动作可能是输出一个字符
串,也可能是
打印作业。具体要干什么由使用定时器的用户来完成。而定义定时器时,根本就不知道要干
什么。
public class Timmer {
private long time;
private Action action;
public Timmer() {}
public Timmer(long time, Action action) {
this.time = time;
this.action = action;
}
public void start() {
state = START;
if(th == null) {
th = new Thread() {
public void run() {
while(state == START) {
try {
Thread.sleep(time);
action.action();
} catch(Exception e) {
}
}
}
};
}
th.start();
}
public void stop() {
state = STOP;
}
public void setTime(long time) {
this.time = time;
}
public void setAction(Action action) {
this.action = action;
}
public long getTime() {
return (this.time);
}
public Action getAction() {
return (this.action);
}
}
Action是一个接口,它只有一个方法,就是要完成的任务。我们在定时器启动时调用这个接
口的方法。而这个Action接口的对象,代表一个动作,这个动作就是用户要完成的动作。
public interface Action {
public void action();
}
public static void main(String[] args) {
Timer t = new Timer(2000, new Action() {
public void action() {
System.out.println("Hello World!");
}
});
t.start();
javax.swing.JOptionPane.showMessageDialog(null, "点击确定按钮停止定时器");
t.stop();
System.exit(0);
}
这是一个典型的回调方法例子。在AWT中,java使用了大量的监听器。这些监听器都是回调方法。在XML解析器
SAX中,也使用了回调方法来解析XML文档。
接口要比抽象类还要抽象。抽象类需要子类继承,而Java是单继承,所以抽象类被限制了。
而接口不同,一个类可以实现多个接口。好比人类与程序员类之间的关系。可以说程序员是人类的子类,
如果程序员是一个接口。用人类的子类来实现它就会更好。这个子类还可以去实现会计接口、音乐家接口
等等。
在struts2.0、spring、hibernate等框架中,都大量使用接口。
我们关心的是某个接口与另一个接口之间的关系。而不关心某个实现类与另一个接口实现类的关系。在客观世界中,我们交谈时都大
量使用接口,只是我们没有注意罢了。如:我公司需要一个程序员(一个实现了程序员接口的对象)。
上课时,讲师有一台计算机,用白板笔在白板上写字(计算机是接口,白板及白板笔也是接口)
。讲师希望学生能学会所有的知识(讲师及学生都是接口)。