扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:闹市孤僧 2007年5月29日
关键字:
首先创建一个任务,并在运行10次以后退出运行,代码如下:
package com.baobaotao.basic.timer;
import java.util.Date;
import java.util.TimerTask;
public class SimpleTimerTaskextends TimerTask{
private int count = 0;
public void run() {
System.out.println("execute task.");
Date exeTime = (new Date(scheduledExecutionTime()));①获取本次安排执行的时间点
System.out.println("本次任务安排执行时间点为:"+exeTime);
if(++count > 10){cancel();}② 在任务运行10次后主动退出运行
}
}
通过扩展TimerTask并实现run()抽象方法定义一个任务。在JDK Timer中没有指定运行特定次数任务的方法。你可以在任务的run()方法中通过自定义代码实现。
下面通过Timer以固定延迟时间的方式每5秒执行一次任务:
package com.baobaotao.basic.timer;
import java.util.Timer;
import java.util.TimerTask;
public class TimerRunner {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new SimpleTimerTask();
timer.schedule(task,1000L,5000L); ①在延迟1秒钟后,每5秒钟运行一次任务
}
}
运行以上代码,将输出以下信息:
execute task.
本次任务安排执行时间点为:Thu Mar 15 18:39:37 CST 2007
execute task.
本次任务安排执行时间点为:Thu Mar 15 18:39:42 CST 2007
execute task.
本次任务安排执行时间点为:Thu Mar 15 18:39:47 CST 2007
Spring在org.springframework.scheduling.timer中提供了几个JDK Timer的支持类,主要在以下三方面对JDK Timer提供了支持:
1) ScheduledTimerTask,它对TimerTask提供封装并或配置调度信息;
2)通过MethodInvokingTimerTaskFactoryBean类可以将一个Bean的方法封装为TimerTask;
3)通过TimerFactoryBean可以更方便地配置Timer,此外让Timer的生命周期和Spring容器的生命周期相关,在初始化TimerFactoryBean后,启动Timer,在Spring容器关闭前取消Timer。
JDK Timer标准的API要求我们使用Timer方法进行任务调度时才指定调度的规则,这种方式不太适合进行Bean的配置,因此Spring提供了ScheduledTimerTask,通过属性指定任务和调度规则,请看下面的代码:
<bean id="timerTask"class="com.baobaotao.basic.timer.SimpleTimerTask" />
<bean id="scheduledTask"class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="timerTask" ref="timerTask" />①指定调度任务
<property name="delay" value="1000" />②延迟时间,单位为毫秒
<property name="period" value="1000" />③周期时间,单位为毫秒
</bean>
如果只希望运行一次任务,将period设置为0或负值。默认情况下,采用固定时间间隔的调度方式,可以通过fixedRate属性,以固定频率的方式运行任务。SimpleTimerTask还可以将实现了Runnable接口的类封装成一个任务,你可以通过runnable属性进行设置。
类似于Quartz的MethodInvokingJobDetailFactoryBean,Spring也为JDK Timer提供了一个方便类用以将Bean方法封装成一个TimerTask:
<bean id="myService" class="com.baobaotao.service.MyService" />
<bean id="timerTask1"① 将返回一个TimerTask实例
class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myService" />② 业务Bean
<property name="targetMethod" value="doJob" />③ 业务方法
</bean>
类似于Quartz的SchedulerFactoryBean,Spring为Timer提供了TimerFactoryBean类。你可以将多个ScheduledTimerTask注册到TimerFactoryBean中,TimerFactoryBean将返回一个Timer实例。在TimerFactoryBean初始化完成后,对应的Timer启动,在Spring 容器关闭之前,TimerFactoryBean将取消Timer。请看下面的配置代码:
<bean id="timer"class="org.springframework.scheduling.timer.TimerFactoryBean">
<property name="scheduledTimerTasks">
<list>
<ref bean="scheduledTask" />
</list>
</property>
</bean>
scheduledTimerTasks属性的类型为ScheduledTimerTask[],可以注入多个ScheduledTimerTask。此外TimerFactoryBean还拥有一个daemon属性,指定生成Timer的背景线程是否为后台线程。
JDK Timer可以满足一些简单的任务调度需求,好处就是你不必引用JDK之外的第三方类库,学习也很简单。
但你必须保证你的任务是短小型的任务,任务应该很快就能执行完成,否则将产生“时间漂移”的问题。此外,使用JDK Timer的任务对执行时间点应该没有严格的要求,因为JDK Timer只能做到近似的时间安排。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者