Java多线程--Timer初识(一)

2014-11-24 03:11:25 · 作者: · 浏览: 0
Timer初识 Timer在英文中的意思是“定时器”,那么早在JDK1.3的时候,这个计时器类就出现在了JDK的类库中,所见即所得,显示生活中定时器的作用显而易见,也非常的实用。又比如我们常见的定时炸弹就是一个定时器的典型应用,再一个上班族都感知切的一个就是闹钟了,特别是正点闹钟(我个人用的是正点闹钟这个app,挺好用的,顺便打个小广告),这个闹钟我们设定了一个时间后,只要不发生bug,就会每天那个时间点叫我们起床了,可是这个又爱又恨的闹钟啊,我这里就借用你的苦衷来说说程序世界的Timer了~ ~

开门见山:(一年级的小K按捺不住了,本拉登情怀大爆发,危险迫在眉睫) K:吼吼,我要搞恐怖,我要搞炸弹...
	public static void main(String[] args) {
		Timer timer = new Timer();  // 创建一个定时器
		timer.schedule(new TimerTask() { // 定时器调度执行一个定时器任务
			@Override
			public void run() {
				System.out.println("bombing...");
			}
		}, 5000);
		time(); // 计时,直观打印执行时间
	}
K:不要无视我的发明,定时鞭炮有他就没你(由于修炼不够,小K最终搞了个定时鞭炮):
1.Timer timer = new Timer();要搞一个定时鞭炮,首先得搞一个弹夹吧,这里做了一个定时弹夹,然后贴上商标“我是牛牛定时...”还不能爆炸,不敢往后吹了。
2.new TimerTask() {...}这里才是定时鞭炮的核心东西,把线路和火药安装好,然后塞到炸弹夹中,这样才有可能发出威力了。
3.timer.schedule(new TimerTask() {...}, 5000); 遥控器一按,5秒钟后我就要爆炸,吼吼吼~
Y:小K别逗了,虽然炸了,可是那个time()是个啥玩意吗?! K:嗨,看好了,这个time()是我的一个小弟(方法),他没啥事就给报时的呢,不要再问了哈,烦得很!
/**
	 * 计时,直观打印执行时间
	 */
	private static void time() {
		int second = 0;
		int minute = 0;
		int hour = 0;

		while (true) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			second++;
			if (60 == second) {
				second = 0;
				minute++;
				if (60 == minute) {
					hour++;
					minute = 0;
				}
			}
			System.out.println((hour < 10   ("0" + hour) : hour) + "【时】"
					+ (minute < 10   ("0" + minute) : minute) + "【分】"
					+ (second < 10   ("0" + second) : second) + "【秒】");
		}
	}
Y:呦呵,还带小弟呢,让你小弟给我也报报时,不然我哪知道你的定时炸弹的定时效果是不是精确的。嗯...你这个定时鞭炮不给力啊,我见过年那些小家伙玩的炮火都有五连响呢??? K:哈哈,莫急莫急,待我潜心研究研究,搞科学嘛,来不得半点虚假的噢... 一个月后的一天,操场上第八套广播体操进行时,只见小K报了一个大家伙,屁颠屁颠的跑向中心,手做喇叭状,噼里啪啦开始了:
	public static void main(String[] args) {
		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			@Override
			public void run() {
				System.out.println("bombing...");
			}
		}, 5000, 1000); // 五秒钟爆炸后延迟一秒钟再接着炸,如此反复下去
		
		
		time(); // 小弟报时中...
	}
K:(只见小K一脸得意),偶闭关修炼一个月,也搞了个连环炸弹,那些连环炮算个啥,我这可是无限连环炸,呵,呵呵,呵呵呵... Y:... ...小k,你这个很饶民的,你不让停下来我就去告官啦啦啦~
K:OMG,我发明这个的时候没有想过去停止他耶,给我点时间想想,再说你告官,你兜里没子呢,同学一场嘛... 【正当大家要抓小K去官府的时候,小K屁股一拍,一溜烟就跑的无踪影了,可是响声将大家的愤怒一直进行到底...】 ...... ...... 【一周后,小K拖着一副疲惫的身躯出现在同学面前,可是这次他手上的那玩意看起来很华丽,远处看上去多了一些东西:】
	public static void main(String[] args) {

		Timer timer = new Timer();
		timer.schedule(new TimerTask() {
			int times = 0; // 可以外部设定

			@Override
			public void run() {
				System.out.println("bombing...");
				times++;
				if (5 == times) {
					cancel(); // 取消任务
				}
			}
		}, 5000, 1000); // 五秒钟爆炸后延迟一秒钟再接着炸,如此反复下去

		time(); // 小弟报时中...
	}
【只听见炸了五响,就停了,这才稍微消解大家心头的愤怒,于是有人发现商机了...】 Y:小K,你小子可以啊,你这次出山,在上面搞了那么多按钮,看起来华丽了,实际上也更华丽了,那个,那个...能不能给个操作手册啊,让你的发明在我们这发扬。 【一帮小弟蜂拥而上,捶背,捏腿,一身疲惫的小K似乎找到了一点点成就感。】 K:一帮臭小子,早就料到你们有这一出,要不然我披星戴月图啥,听好了,先给你们说道说道我的发明【从口袋抽出遥控器,指着上面的按钮手舞足蹈地开始演讲】: schedule(TimerTask task,Date time);指定时间开始爆炸。 schedule(TimerTask task, long delay);指定delay毫秒延迟时间后爆炸一次。【小K之间的发明】
schedule(TimerTask task,Date firstTime, long period) ;指定firstTime开始爆炸,然后延迟period毫秒后循环爆炸。
schedule(TimerTask task, long delay, long period);指定延迟delay毫秒后开始爆炸,然后延迟period毫秒后循环爆炸。
cancel();认为控制爆炸次数和时间,取消定时器的任务。
【..... 小K还没有讲完,一家伙抢过去手册,快速走观之后提出一疑问:" scheduleAtFixedRate(TimerTask task,Date firstTime, long period)"和" scheduleAtFixedRate(TimerTask task,long delay, long period)"有是社么意思呢?】 小K:猴急啥,正要将呢: schedule(TimerTask task, long delay, long period)第一次在指定的delay延