一、概述:

最近维护一个老项目,里面使用的是Timer的时间调度器,以前没接触过,对着代码鼓捣了半天,查阅了部分博客,最后总结出自己的见解,新项目一般是不会用这种老掉牙的时间调度器了,但是维护老项目还是用的着的。就当笔记记录一下了,自己写的才是符合自己的思路走向的。有时间再补上Quartz调度器,这个才是现在使用最多的。

二、常用的三种调度器分类

Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。

使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

三、使用Spring体系来完成代码的搭建

1、代码结构:

                                  

2、springContext.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
default-lazy-init="true"> <!--定义了一个TimerFactoryBean类,并且把ScheduledTimerTask类的实例作为需要调度的task。-->
<bean id="timerFactory" class="org.springframework.scheduling.timer.TimerFactoryBean" lazy-init="false">
<property name="scheduledTimerTasks">
<list>
<ref local="scheduledTask1"/>
<ref local="scheduledTask2"/>
</list>
</property>
</bean> <!--利用ScheduledTimerTask类来配置每个task的启动时间延时,每次启动之间的间隔,当然还有最重要的是需要运行那个对象,也就是MethodInvokingTimerTaskFactoryBean类的实例-->
<bean id="scheduledTask1" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="1000" />
<property name="timerTask">
<ref bean="methodInvokingTask1"/>
</property>
</bean> <bean id="scheduledTask2" class="org.springframework.scheduling.timer.ScheduledTimerTask">
<property name="delay" value="0" />
<property name="period" value="1000" />
<property name="timerTask">
<ref bean="methodInvokingTask2"/>
</property>
</bean> <!--利用spring提供的MethodInvokingTimerTaskFactoryBean类来实现来实现对对task类和方法的声明,声明目标对象和方法,从而使spring知道要运行那个类的那个方法-->
<bean id="methodInvokingTask1" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask1"/>
<property name="targetMethod" value="run"/>
</bean> <bean id="methodInvokingTask2" class="org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean">
<property name="targetObject" ref="myTask2"/>
<property name="targetMethod" value="run"/>
</bean> <!--被指定自动任务的类对象-->
<bean id="myTask1" class="com.turtle.test.MyTask">
<property name="name" value="启动一"/>
</bean> <bean id="myTask2" class="com.turtle.test.MyTask_2">
<property name="name" value="启动二"/>
</bean> </beans>

3、MyTask文件

package com.turtle.test;

import java.util.TimerTask;

/**
* 自定义一个定时任务
* 推荐是继承自 TimerTask
*/
public class MyTask extends TimerTask { private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} private static int i = 0; // 使用线程中的方法 run
@Override
public void run() {
System.out.println("定时任务启动"+name+"----出现了"+i++);
}
}

4、MyTask_2文件

package com.turtle.test;

import java.util.TimerTask;

/**
* 自定义一个定时任务
* 推荐是继承自 TimerTask
*/
public class MyTask_2 extends TimerTask { private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} private static int i = 0; // 使用线程中的方法 run
@Override
public void run() {
System.out.println("定时任务启动"+name+"----出现了"+i++);
}
}

5、MyTestTask_Test_01

package com.turtle.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyTestTask_Test_01 {
public static void main(String[] args) {
// 启动测试
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springContext.xml");
}
}

6、结果:

                        

四、总结:

如果要使用TImer的调度器的话,推荐使用新的ScheduledExecutorService,这个目前没使用,就没进行代码验证了,推荐一博客,大概看了下,写得挺好的https://blog.csdn.net/wangmx1993328/article/details/80840598

最新文章

  1. 实体框架高级应用之动态过滤 EntityFramework DynamicFilters
  2. RedRabbit——基于BrokerPattern服务器框架
  3. Nginx_地址重写(rewrite)_日志管理(log_format)_压缩输出_Nginx设定限速_Nginx设置反向代理及反向代理缓存
  4. java中通过位运算实现多个状态的判断
  5. [Java] Serializable(序列化)的理解
  6. 杭电ACM2057--A + B Again
  7. &lt;a href=&quot;onclick=&quot;javascript:goSearch(this)&quot; class=&quot;click&quot; name=&quot;Java&quot;&gt;Java&lt;/a&gt;为什么a标签的父节点获取不到
  8. [改善Java代码]使用构造函数协助描述枚举项
  9. 【非原】c语言之声明和定义的区别
  10. POJ1384完全背包问题
  11. PCB快速打样规范
  12. 远程ubuntu虚拟机Tensorflow搭建 - 1 SSH连接
  13. BAT清理垃圾
  14. Android系统Root原理初探(转)
  15. SVG关注复杂图形的网页绘制技术
  16. 求最小的k个数
  17. 《物联网框架ServerSuperIO教程》-19.设备驱动和OPC Client支持mysql、oracle、sqlite、sqlserver的持久化。v3.6.4版本发布
  18. python实现关键词提取
  19. Luogu3191 HNOI2007 紧急疏散 二分答案、最大流
  20. 廖雪峰Java2面向对象编程-5包和classpath-1包package

热门文章

  1. Python3 os.path() 模块
  2. python编程基础之七
  3. 基于STM32F429和HAL库的CAN收发例程
  4. JavaScript:如何获取某一天所在的星期
  5. 爬虫 xpath
  6. Qt5教程: (3) 自定义信号与槽
  7. powerCat进行常规tcp端口转发
  8. 关于用gulp合并压缩seaJs模块
  9. Spring Boot 入门(七):集成 swagger2
  10. 概率图模型(PGM):贝叶斯网(Bayesian network)初探