一些定时器的介绍

在程序中经常有建立定时异步任务的需求,下面介绍几种实现方法:
1,使用spring quartz定时器
Quartz是一个强大的企业级任务调度框架,Spring中继承并简化了Quartz,下面就看看在Spring中怎样配置Quartz。
首先,定义一个执行定时异步任务的类和方法,以MySchedule和其中的perform方法为例,然后在spring-quartz.xml中配置:
        

 <!-- 配置任务类 -->
 <bean id="mySchedule" class="com.raycloud.quartz.MySchedule"/>
 <!-- 定义任务。在Spring配置文件中配置代理类MethodInvokingJobDetailFactoryBean,定义任务的详细信息。 -->
 <bean id="task" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="mySchedule"/>
  <property name="targetMethod" value="perform"/>
 </bean>
 <!-- 配置一个触发器定义触发时间。在Spring配置文件中配置触发器类CronTriggerBean -->
 <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="task"/>
  <property name="cronExpression" value="0 52 10 * * ?"/>
 </bean>
 <!-- 配置一个调度器。在Spring配置文件中配置调度器类 SchedulerFactoryBean-->
 <bean id="startSchedule" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
   <list>
    <ref bean="cronTrigger"/>
   </list>
  </property>
 </bean>

 说明:在调度器中,如果将lazy-init='false'那么容器启动就会执行调度程序。
至此,一个 spring quartz定时器便完成了。
2,使用ScheduledExecutorService类
ScheduledExecutorService接口继承了ExecutorService接口,可安排在给定的延迟后运行或定期执行的命令,它只有一个实现类ScheduledThreadPoolExecutor,其中的scheduleAtFixedRate和scheduleWithFixedDelay方法创建并执行某些在取消前一直定期运行的任务。在程序中经常这样使用:

ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);
scheduledExecutorService.scheduleWithFixedDelay(taskThread, 1, 20, TimeUnit.SECONDS);

 其中taskThread是一个实现了Runnable接口的类TaskThread的对象,在TaskThread,的run方法中执行了所要执行的异步定时任务。
scheduledExecutorService.scheduleWithFixedDelay(taskThread, 1, 20, TimeUnit.SECONDS);
便定义了该任务执行的时间和频率。
3,使用Timer来实现
由于Timer对任务的调度是基于绝对时间的;所有的TimerTask只有一个线程TimerThread来执行,因此同一时刻只有一个TimerTask在执行;任何一个TimerTask的执行异常都会导致Timer终止所有任务;由于基于绝对时间并且是单线程执行,因此在多个任务调度时,长时间执行的任务被执行后有可能导致短时间任务快速在短时间内被执行多次或者干脆丢弃多个任务。
而ScheduledExecutorService克服了上述缺点,因此一般不建议使用timer。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值