黑马程序员 日记一:传统定时器Timer及TimerTask。
来源:互联网 发布:sql常用查询语句大全 编辑:程序博客网 时间:2024/05/18 01:23
---------------------- android培训、java培训、期待与您交流! ----------------------
类似于Thread类和Runnable接口,TimerTask触发实现的功能,必须重写run()方法。经过查阅API文档,可知,TimerTask类和Thread类一样,都实现了Runnable接口。
关于循环使用定时器:
张老师的视频中,循环实现定时器的代码如下:
public class TtaditionalTimerTest {
private static int count = 0;
public static void main (String[] args) {
class MyTimerTask extends TimerTask {
count = (count+1)%2;
System.out.println ("bombing!");
new Timer ().schedule (new MyTimerTask (), 2000+2000*count);
}
new Timer ().schedule (new MyTimerTask (), 2000);
while (true) {
try {
System.out.println (new Date ().getSeconds());
Thread.sleep (1000);
} catch (InterruptedException e){
e.printStackTrace ();
}
}
}
}
从这段代码中,学会使用Timer及TimerTask的使用方法,已经循环使用定时器的一种方法。
但是由此产生的疑问:在main方法中定义了一个新类,在以往的经验中,虽然使用过内部类,但是都是在方法外定义的,不能定义在方法内。
解答:经过查阅资料,得知,如此定义的内部类称为方法内部类。
方法内部类有以下使用规则:
1.方法内部类只能在定义该内部类的方法内实例化,不能在其方法外进行实例化。
2.方法内部类对象不能使用该内部类所在方法的非final局部变量。
故在以上代码中,count变量只能用静态全局变量。
老师在视频中,提到使用两个TimerTask子类,实现循环定时器的效果,我自己实现另外一种循环使用定时器的方法:
public class TtaditionalTimerTest {
public static void main (String[] args) {
class MyTimerTask 1 extends TimerTask {
System.out.println ("bombing!");
new Timer ().schedule (new MyTimerTask2 (), 2000);
}
class MyTimerTask 2 extends TimerTask {
System.out.println ("bombing!");
new Timer ().schedule (new MyTimerTask 1(), 4000);
}
new Timer ().schedule (new MyTimerTask (), 2000);
while (true) {
try {
System.out.println (new Date ().getSeconds());
Thread.sleep (1000);
} catch (InterruptedException e){
e.printStackTrace ();
}
}
}
}
猜想:利用以上代码,实现一个利用两个方法内部类实现循环定时器。在该代码中,MyTimerTask1的run方法中,new Timer()的schedule方法中,使用一个MyTimerTask2,而在MyTimerTask2中run方法中,new Timer()的schedule方法中,使用一个MyTimerTask1,这样循环往复,就能实现循环计时。
但是在实际实验中,发现,在同一个方法中,定义两个方法内部类,第一个内部类调用第二个内部类时候,第二个内部类会出现无法实例化的错误。
所以,只能把两个TimerTask子类作为独立的类实现。如下:
主类
package com.itheima.beak;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class TimeerDemo {
/**
* @param args
*/
//static int count = 0;
//static int[] times = {1000, 1000, 1000, 1000, 1000, 3000};
public static void main(String[] args) {
/*class MyTimerTask2 extends TimerTask {
//已经注释掉;
@Override
public void run() {
System.out.println ("bombing");
new Timer ().schedule(new MyTimerTask1(), 2000);
}
}
class MyTimerTask1 extends TimerTask {
@Override
public void run() {
System.out.println ("bombing");
new Timer ().schedule(new MyTimerTask2(), 4000);
}
}*/
new Timer ().schedule(new MyTimerTask1 (), 1000);
while (true) {
try {
System.out.println (new Date ().getSeconds());
Thread.sleep (1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
第一个TimerTask类MyTimerTask1
package com.itheima.beak;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask1 extends TimerTask {
@Override
public void run() {
System.out.println ("get up!! now");
new Timer ().schedule(new MyTimerTask2(), 2000);
}
}
第二个TimerTask类MyTimerTask2
package com.itheima.beak;
import java.util.Timer;
import java.util.TimerTask;
public class MyTimerTask2 extends TimerTask {
@Override
public void run() {
System.out.println ("get up later!!");
new Timer ().schedule(new MyTimerTask1(), 4000);
}
}
自我扩展:
在老师的视频中,提到一个周一到周五能定时报时,而周六周日不报时的程序。不同于老师提到的quartz,我的实现如下:
static int[] times = {1000, 1000, 1000, 1000, 1000, 3000, 2000};
//依次为sunday, monday, tuesday, wednesday, thursday, friday, Saturday距离下一次报时间隔的时间,为了方便验证,取值较小;
public static void main(String[] args) {
class MyTimerTask extends TimerTask {
@Override
public void run() {
System.out.println ("time to get up!!!"+ new Date ());
new Timer().schedule(new MyTimerTask (), times[Calendar.getInstance().get(Calendar.DAY_OF_WEEK)]); //从数组中取得下次报时的时间间隔
}
}
new Timer ().schedule(new MyTimerTask (), 1000);
while (true) {
try {
System.out.println (new Date ().getSeconds());
Thread.sleep (1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
- 黑马程序员 日记一:传统定时器Timer及TimerTask。
- 传统定时器技术 Timer and TimerTask
- java线程中的传统定时器Timer和TimerTask的使用方法
- Timer TimerTask 定时器线程
- timer+timertask 制作定时器
- 定时器Timer以及TimerTask
- Java定时器(一)Timer类和TimerTask类
- 传统定时器Timer
- 传统定时器Timer
- 传统定时器Timer
- 黑马程序员--传统定时器的回顾
- android定时器Timer与TimerTask
- java定时器--TimerTask 与 Timer
- JAVA定时器Timer&TimerTask剖析
- Java定时器timer以及timerTask
- JAVA定时器 (Timer TimerTask)学习
- Timer定时器、TimerTask、Random随机数
- 定时器实现:Handler+Timer+TimerTask
- MySQL数据读取,ExtJS和PHP Json
- How Google TestsSoftware[完整版]
- 杭电1008解题报告
- javascript中函数构造器和原型研究
- org.hibernate.MappingNotFoundException: resource: xxx.hbm.xml not found
- 黑马程序员 日记一:传统定时器Timer及TimerTask。
- (转)塔吉特读心术——用户数据分析的魔力
- 每日学习总结
- national unified cpu architecture
- shared_ptr解析
- 用Eclipse 开发Dynamic Web Project应用程序
- C语言深度解剖(精讲版)——读书笔记22-函数指针
- 将网卡ethx与其相关的驱动解除绑定
- hdu 1028(普通型母函数)