[原创]Time 和 TimerTask 实例解析_Android, Python及开发编程讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  Android, Python及开发编程讨论区 »
总帖数
4
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3754 | 回复: 3   主题: [原创]Time 和 TimerTask 实例解析        下一篇 
panpan.nie
注册用户
等级:大校
经验:4754
发帖:217
精华:2
注册:1970-1-1
状态:离线
发送短消息息给panpan.nie 加好友    发送短消息息给panpan.nie 发消息
发表于: IP:您无权察看 2014-12-5 14:25:50 | [全部帖] [楼主帖] 楼主

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks
    TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内.

1.实例演示

Timer线程实现和计划执行一个任务的基础步骤:

实现自定义的TimerTask的子类,run方法包含要执行的任务代码

实例化Timer类,创建计时器后台线程。

实例化任务对象

制定执行计划。这里用schedule方法,第一个参数是TimerTask对象,第二个参数表示开始执行前的延时时间

Timer 的一个例子

java.util.Timer timer = new java.util.Timer(true);
// true 说明这个timerdaemon方式运行(优先级低,
// 程序结束timer也自动结束),注意,javax.swing  
// 包中也有一个Timer类,如果import中用到swing包,
// 要注意名字的冲突。
TimerTask task = new TimerTask() {
      public void run() {
            ... //每次需要执行的代码放到这里面。
      }
};
//以下是几种调度task的方法:     
timer.schedule(task, time);
// timeDate类型:在指定时间执行一次。
timer.schedule(task, firstTime, period);
// firstTimeDate类型,periodlong  
// firstTime时刻开始,每隔period毫秒执行一次。
timer.schedule(task, delay)
// delay long类型:从现在起过delay毫秒执行一次
timer.schedule(task, delay, period)
// delaylong,periodlong:从现在起过delay毫秒以后,每隔period  
// 毫秒执行一次。


指定任务的执行时间,如下例

import java.util.TimerTask;
public class TestTask extends TimerTask
{
      static int i=0;
      String name;
      public TestTask()
{}
      public TestTask(String name)
      {
            this.name = name;
      }
      @Override
      public void run()
      {
            System.out.println(name+" start--"+i++);
      }
}
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
public class TestTimer
{
      public static void main(String[] args)
      {
            Timer timer = new Timer();
            Calendar calendar = Calendar.getInstance();
            calendar.set(Calendar.HOUR_OF_DAY, 9);
            calendar.set(Calendar.MINUTE, 55);
            calendar.set(Calendar.SECOND, 0);
            Date time = calendar.getTime();
            timer.schedule(new TestTask("定时执行"), time);
            timer.schedule(new TestTask("延时1s"), 1000);
            timer.schedule(new TestTask("延时1s,3s循环"), 1000,3000);
      }
}


运行结果:

定时执行 start--0

延时1s start--1

延时1s,3s循环 start--2

延时1s,3s循环 start--3

延时1s,3s循环 start--4

……

2.终止Timer线程

默认情况下,只要一个程序的timer线程在运行,那么这个程序就会保持运行。当然,你可以通过以下四种方法终止一个timer线程:

l调用timercancle方法。你可以从程序的任何地方调用此方法,甚至在一个timer taskrun方法里。

ltimer线程成为一个daemon线程(可以在创建timer时使用new Timer(true)达到这个目地),这样当程序只有daemon线程的时候,它就会自动终止运行。

ltimer相关的所有task执行完毕以后,删除所有此timer对象的引用(置成null),这样timer线程也会终止。

l调用System.exit方法,使整个程序(所有线程)终止。

3.重复执行某任务

这里使用了三个参数的schedule方法用来指定task每隔一秒执行一次。如下所列为所有Timer类用来制定计划反复执行task的方法

lschedule(TimerTask task, long delay, long period)
lschedule(TimerTask task, Date time, long period)
lscheduleAtFixedRate(TimerTask task, long delay, long period)
lscheduleAtFixedRate(TimerTask task, Date firstTime, long period)


当计划反复执行的任务时,如果你注重任务执行的平滑度,那么请使用schedule方法,如果你在乎的是任务的执行频度那么使用scheduleAtFixedRate方法。

例如,上例中使用了schedule(new TestTask("延时1s,3s循环"), 1000,3000) 方法,这就意味着所有两次任务之间的时间间隔至少为3秒,也就是说,如果有一个任务因为某种原因迟到了(未按计划执行),那么余下的所有都要延时执行。如果我们想让这个程序正好在3秒以后终止,无论哪一个任务因为什么原因被延时,那么我们需要使用scheduleAtFixedRate方法,这样当第一个迟到时,那么后面的就会以最快的速度紧密执行(最大限度的压缩间隔时间)。

4.注意

每一个Timer仅对应唯一一个线程。

Timer不保证任务执行的十分精确。

Timer类的线程安全的。




赞(0)    操作        顶端 
yr
注册用户
等级:少校
经验:1085
发帖:5
精华:0
注册:2015-1-19
状态:离线
发送短消息息给yr 加好友    发送短消息息给yr 发消息
发表于: IP:您无权察看 2015-1-19 17:53:41 | [全部帖] [楼主帖] 2  楼

巴错巴错 北京联动北方科技有限公司



赞(0)    操作        顶端 
hei_nihao
注册用户
等级:少校
经验:1279
发帖:19
精华:0
注册:2015-4-17
状态:离线
发送短消息息给hei_nihao 加好友    发送短消息息给hei_nihao 发消息
发表于: IP:您无权察看 2015-4-27 11:40:25 | [全部帖] [楼主帖] 3  楼

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks”,不错不错,js里面也有这样的类



赞(0)    操作        顶端 
ainy
注册用户
等级:中士
经验:221
发帖:0
精华:0
注册:2015-4-27
状态:离线
发送短消息息给ainy 加好友    发送短消息息给ainy 发消息
发表于: IP:您无权察看 2015-4-28 22:06:49 | [全部帖] [楼主帖] 4  楼

计时器蛮好用的



赞(0)    操作        顶端 
总帖数
4
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论