ja定时器

Ja实现计时器
线程

在应用开发中,经常需要一些周期性的操作,比如每5分钟执行一次操作。实现这种操作最方便有效的方法是使用ja.util.Timer工具类。ja.util包中有两个类,Timer和TimerTask。Timer直接从Object继承而来,相当于一个定时器,可以用来指定某个时间执行某个任务,或者定期重复执行相同的任务。创建定时器后,会生成一个线程在后面运行,控制任务的执行。TimerTask是用来实现某个任务的类。它实现了Runnable接口,所以它相当于一个线程。

java定时器

第一步:编写测试类,该类extends TimerTask,重新run()方法,run方法里面就是你要执行的逻辑代码,示例如下:

[ja]查看普通副本打印?

导入Ja . text . simple date format;

导入Ja . util . date;

导入Ja . util . timertask;

publicclass MyTest1扩展了TimerTask {

private SimpleDateFormat SF = new SimpleDateFormat(” yyyy-MM-DD hh:MM:ss “);

@覆盖

publicvoid run() {

System.out.println(“现在时间是:”+SF . format(new Date()));

}

}

第二步:编写一个类,该类实现ServletContextListener接口

[ja]查看普通副本打印?

导入jax . servlet . servletcontextevent;

导入jax . servlet . servletcontextlistener;

publicclass TimerTaskManager实现ServletContextListener {

私人定时器Timer;

@覆盖

public void context initialized(ServletContextEvent SCE){

system . out . println(“…………………………”当程序定期执行任务时);

my test1 t = new my test1();

Timer=new Timer(“启动任务”,真);

/*执行MyTest1中的run方法,其中t代表TimerTask的一个子类,0代表延迟0毫秒执行run方法,1000代表每秒执行run方法。后两个参数可以根据自己的需要定义。

*/

timer.schedule(t,0,1000);

}

@覆盖

public void context destroyed(ServletContextEvent SCE){

System.out.println(“……………………………….程序定时执行任务时”);

timer . cancel();

}

}

第三步:在web.xml中添加如下代码里面填写TimerTaskManager的路径,程序在web容器启动后会初始化加载TimerTaskManager的contextInitialized方法。

监听器添加方法:

添加侦听器标记,并在侦听器中添加侦听器类标记。listener-class标签中的内容是TimerTaskManager的路径,比如:com.TimerTaskManager。

例如:

[html]查看纯文本打印?

& lt听众& gt

& lt侦听器类& gtWeiming . lmapp . timer . syscontextlistener & lt;/listener-class & gt;

& lt/listener & gt;

相关注意点分析:

1、任务调度应优先保证实时性。

由于Ja的性质,以及在开发JDK的过程中要考虑不同的平台,不同平台的线程调度机制是不一样的,所以各种平台下JVM的线程调度机制也是不一致的。因此,Timer不能保证任务会在指定的时间内执行。此外,由于TimerTask实现了Runnable接口,在TimerTask被放入线程队列休眠一段时间(wait)后,到了调用TimerTask的时候,执行的确切时间取决于JVM的调度策略和当前有多少线程在等待CPU处理。因此,不能保证任务会在指定的时间内执行。任务执行通常在以下两种情况下被延迟:

(1)有大量线程等待执行。

(2)GC机制的影响导致延迟。

这就是为什么Timer API中有两套调度方法的原因。即:

(1)附表()

固定延迟调度。使用这种方法时,任务执行中的每一次延迟都会传播到后续的任务执行中。

(2)、scheduleAsFixedRate()

固定比率调度。使用这种方法时,所有后续执行都是按照初始执行的时间来调度的,所以希望减少延迟。

使用哪种方法取决于哪些参数对您的程序或系统更重要。

2.每个定时器对象应该在后台启动一个线程。在某些托管环境中,例如在应用程序服务器中,不建议使用此属性。因为这些线程不受容器的控制。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

发表回复

登录后才能评论