【在Timer初识中,小K给我们展示了一个定时器的应用,小K是个恐怖主义和保守主义的结合着,初衷是整炸弹的,结果由于能力不足,整成鞭炮,最后由于保守也不敢去干维护社会秩序的事,经过一番醒悟,小K改名为小钟,重出江湖,但这次他带着自己的小发明“闹钟”穿越到了盛唐时代来推销他的闹钟...】
小钟二话不说,拿出他的代码说明书:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Date alarmTime = new GregorianCalendar().getTime();
System.out.println("【" + alarmTime + "】It' time to get up...");
}
}, new Date(), 24 * 60 * 60 * 100); // 间隔一天【大家一看楞住了,这么简单,能用吗???于是有人抱着试试带头买了,但是有个限制,一旦买了之后,闹钟的时间是不能修改的,比如说谁要几点的,谁要几点的都要提前说好,小钟拿着票子飘然而去,打道回府继续修炼...】
【一个月的时间过去了,当初买了闹钟的哥们发现了这个闹钟的缺点,议论纷纷要找到小钟看看有木有新的发明,正在这时,只见小钟满面春风得走到人群中。】
小钟:各位父老乡亲,很烦一个月前买的那个闹钟了,有木有?我这次出来唯一的目的是解决你们的烦恼的,我的发明有了重大的进步,每个人都有机会来与我共享,嗯...嗯...当然你们需要给我点辛苦费和研究经费噢,下面是我的重要改进:
【小钟给自己好好冲了一次电,将 Java的面向对象好好利用了一把,但是好像还不是很娴熟...】
闹铃驱动类:AlarmDriver
public class AlarmDriver {
private Date firstTime;
public AlarmDriver(Date firstTime) {
this.firstTime = firstTime;
}
public void alarm() {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println("【" + firstTime + "】It' time to get up...");
}
}, firstTime, AlarmClock.DAY_PREIOD); // 间隔一天
}
}【这是一个闹钟的设置单元,小钟从包里掏出一个玩意儿,上面有个小屏幕和几个按钮~】
/**
* 闹钟类,可以实现多个时间点闹铃
*
* @author ysjian
* @version 1.0
* @email ysjian_pingcx@126.com
* @QQ 646633781
* @telephone 18192235667
* @csdnBlog http://blog.csdn.net/ysjian_pingcx
* @createTime 2014-2-10
* @copyRight Merit
*/
public class AlarmClock {
/** 一天时间的间隔毫秒数 */
public static final long DAY_PREIOD = 24 * 60 * 60 * 1000;
private List
drivers = new ArrayList<>();
/**
* 添加闹铃驱动器
*
* @param driver
*/
public void addAlarm(AlarmDriver driver) {
drivers.add(driver);
}
/**
* 移除闹铃驱动器
*
* @param driver
*/
public void removeAlarm(AlarmDriver driver) {
drivers.remove(driver);
}
/**
* 清除闹铃驱动器
*
*/
public void clearAlarm() {
drivers.clear();
}
/**
* 设置闹铃,提供用户时间输入接口
*
* @param firstTime
* 第一次响铃时间
*/
public void alarm(Date firstTime) {
alarm(firstTime, DAY_PREIOD);
}
private void alarm(Date firstTime, long period) {
for (AlarmDriver driver : drivers) {
driver.alarm();
}
}
}
【众位父老乡亲一脸期盼的表情看着小钟,格外的安静!】
【小钟对着众位巴拉巴拉起闹钟上的按钮,经过不到一分钟的时间,简易的操作把父老乡亲的疑惑从脸上移除,顿时一包的闹钟一枪而空,小钟跑到一边点钱开来,显然丰收了...】
【天黑了,小钟回到自己小窝里突然沉思了:我的闹钟一旦设置就会隔一天响一次,如果明天想睡个懒觉不想让它闹铃,这个可是很重要的功能啊,沉思中,小钟拿起草稿纸,显然是在写功能代码】
第一版草稿,通过自定义一个TimerTask,在run方法中调用启动一个定时器,传入一个新的对象,但是间隔已经改变
public class Inteva lAlarm {
public static void main(String[] args) {
AlarmTask task = new Inteva lAlarm().new AlarmTask();
new Timer().schedule(task, 2000);
}
private static int count = 1;
class AlarmTask extends TimerTask {
@Override
public void run() {
count = (count + 1) % 3;
System.out.println("alarming...");
// 循环启动,分别相隔2秒或4秒启动一个新的定时器
new Timer().schedule(new AlarmTask(), 2000 + 2000 * count);
}
}
}【小钟面露喜色,继续挥动着手,十分钟后...】
第二版草稿,通过两个定时任务来互相调用:
public class Inteva lAlarm2 {
public static void main(String[] args) {
Inteva lAlarm2 alarm = new Inteva lAlarm2();
new Timer().schedule(alarm.new AlarmTask1(), 2000);
}
// 下面是两个不同的定时器实现不同间隔的定时任务
class AlarmTask1 extends TimerTask {
@Override
public void run() {
System.out.println("alarming...");
new Timer().