Java多线程--Timer补充(一)

2014-11-24 02:36:24 · 作者: · 浏览: 5
Timer补充
【在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().