Java多线程-50-Timer类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/85846846

这篇来学习Timer类的基本使用,什么是Timer类,查看Java jdk API文档,可以看到第一句话:一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。这句话,就是我们本篇学习和练习的内容。生活中实际使用的例子有:手机闹钟,你可以设置闹钟一次,或者重复闹钟,例如上班期间周一到周五,早上六点半设置闹钟。如果是android手机,闹钟就用到了Timer类。等学习完本篇,你就知道android闹钟的工作原理。

1.查看Timer类 API文档

打开JDK 6 API文档,搜索Timer,注意是 java.util.Timer ,这样就看到了文章提到的这句话。

       这里,我们来练习使用这两个schedule方法。schedule方法的作用就是安排制定的时间执行指定的任务。我们就来模仿闹钟的设置来学习这两个成员方法。

2. schedule(TimerTask task, Date time)

这个方法有两个参数,TimerTask是一个类实现了Runnable接口,作用是由 Timer 安排为一次执行或重复执行的任务。举例,闹钟响铃就是这里的TimerTask。第二个参数是一个时间,可以精确是年月日时分秒。下面,我们来写一段代码,模仿闹钟在制定的时间闹铃。

package thread;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

public class Timer_Demo {

	public static void main(String[] args) throws InterruptedException {
		myTimerTask mt = new myTimerTask();
		Timer t = new Timer();
		// set year: 2019-1900 = 119
		t.schedule(mt, new Date(119, 0, 5, 12, 43,40) );
		while(true) {
			Thread.sleep(1000);
			System.out.println(new Date());
		}

	}

}

class myTimerTask extends TimerTask {

	@Override
	public void run() {
		System.out.println("起床去上班了!");
	}
	
}

这里我们定义一个自定义task类,继承了TimerTask类。这里我们当然写不出调用声卡驱动程序去响铃,所以,这里我们就写一个打印语句,显示起床去上班。在new Date()这里强调下,年份和月份的写法。年份=今年2019-1900=119,月份范围是0到11.执行结果是。

Sat Jan 05 12:43:32 CST 2019
Sat Jan 05 12:43:33 CST 2019
Sat Jan 05 12:43:34 CST 2019
Sat Jan 05 12:43:35 CST 2019
Sat Jan 05 12:43:36 CST 2019
Sat Jan 05 12:43:37 CST 2019
Sat Jan 05 12:43:38 CST 2019
Sat Jan 05 12:43:39 CST 2019
起床去上班了!
Sat Jan 05 12:43:40 CST 2019
Sat Jan 05 12:43:41 CST 2019
Sat Jan 05 12:43:42 CST 2019

3.schedule(TimerTask task, Date time, long period)

添加了一个固定延迟的参数,上面这个例子我们是在特定时间点去打印起床去上班,那么有时候闹钟闹一次,你不去关闭,不理它。过几分钟有来响铃,这个是怎么实现的呢。看下面代码。

Sat Jan 05 13:52:43 CST 2019
Sat Jan 05 13:52:44 CST 2019
起床去上班了!
Sat Jan 05 13:52:45 CST 2019
Sat Jan 05 13:52:46 CST 2019
Sat Jan 05 13:52:47 CST 2019
起床去上班了!
Sat Jan 05 13:52:48 CST 2019
Sat Jan 05 13:52:49 CST 2019
Sat Jan 05 13:52:50 CST 2019
起床去上班了!
Sat Jan 05 13:52:51 CST 2019
Sat Jan 05 13:52:52 CST 2019
Sat Jan 05 13:52:53 CST 2019
起床去上班了!
Sat Jan 05 13:52:54 CST 2019

上面设置了三秒的延迟,如果不主动关闭执行,每间隔三秒就闹铃一次。当然如果要模仿闹钟那样,第一次延迟十分钟,第二次延迟五分钟,第三次更短。那么这个也好做,定义一个retry变量,例如初始化间隔时间设置10分钟,那么我们上面代码间隔时间就可以这样写 (60000/2*retry), 用户忽略不关闭闹钟一次,retry次数就加1.。所以,闹钟的原理,大致就是这么实现的。

 

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/85846846
今日推荐