Java定时任务的简单实现
2013-11-21 15:31
453 查看
package com.weiyuanit.test1; import java.util.Date; import java.util.TimerTask; /*********************** * @author:han * @version:1.0 * @created:2013-11-20 *********************** */ public class MyTask extends TimerTask { @Override public void run() { //此处添加具体任务代码 try { System.out.println(" =============== call at :" + (new Date())); } catch (Exception e) { System.out.println("-------------解析信息发生异常--------------"); e.printStackTrace(); } } }
package com.weiyuanit.test1; import java.util.Calendar; import java.util.Date; import java.util.Timer; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; /*********************** * 定时任务测试 * @author:han * @version:1.0 * @created:2013-11-20 *********************** */ public class MyListener implements ServletContextListener{ private Timer timer = null; //时间间隔 private static final long PERSIOD_DAY = 24 * 60 * 60 * 1000; public void contextDestroyed(ServletContextEvent sce) { // TODO Auto-generated method stub timer.cancel(); } public void contextInitialized(ServletContextEvent sce) { timer = new Timer(true); //设置任务计划,启动和间隔时间 //timer.schedule(new MyTask(),0, 86400000); MyTask myTask = new MyTask(); //1.立刻开始执行myTask的任务,只执行一次 // timer.schedule(myTask, new Date()); //2.立刻开始执行myTask的任务,执行完本次任务,隔3秒再执行一次 // timer.schedule(myTask, new Date(),3000); //3.5秒钟后开始执行myTask的任务,只执行一次 // timer.schedule(myTask, 5000); //4.5秒钟后开始执行myTask的任务,执行完本次任务后,隔3秒再执行一次 // timer.schedule(myTask, 5000,3000); //5.立刻开始执行myTask任务,每隔3秒再执行一次 // timer.scheduleAtFixedRate(myTask, new Date(), 3000); //6.秒钟后开始执行myTask任务,每隔3秒执行一次 // timer.schedule(myTask, 5000,3000); /** * 需要注意的是scheduleAtFixedRate和schedule在参数完全相同的情况下,执行效果是不同的。 * 上面例子中任务只是打印一个字符串,比较简单。 * 但如果任务比较复杂,或者由于任何原因(如垃圾回收或其他后台活动)而延迟了某次执行, * 则scheduleAtFixedRate方法将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”; * 而schedule方法的后续执行也将被延迟。 * 所以,在长期运行中,scheduleAtFixedRate执行的频率将正好是指定周期的倒数,schedule 执行的频率一般要稍慢于指定周期的倒数。 另外,TimerTask的构造函数是protected,所以无法再类中直接new一个TimerTask,而只能写一个类继承TimerTask。 */ /* try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(" 1 "); //timer.cancel();//结束任务执行,程序并不终止 System.out.println(" 2 ");*/ //7.定制每日夜里2:00执行方法 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 14); calendar.set(Calendar.MINUTE, 24); calendar.set(Calendar.SECOND, 0); //第一次执行定时任务的时间 Date date = calendar.getTime(); /** * 如果第一次执行定时任务的时间 小于 当前的时间, * 此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。 * 如果不加一天,任务会立即执行 */ if (date.before(new Date())) { date = this.addDate(date, 1); } //timer.schedule(myTask, date,PERSIOD_DAY); timer.schedule(myTask, date,5000); /** * 注意事项: * 一定要注意时间点的问题。如果你设定在凌晨2点执行任务。但你是在2点以后发布程序 * 或是重启过服务。那这样的情况下,任务会立即执行,而不是等到第二天的凌晨2点再执行。 * 为了避免这种情况发生,只能判断一下,如果发布或重启服务的时间晚于定时执行任务的时间, * 就在此基础上加一天。 */ } /** * 增加或减少天数 * ******************* * @author: han * 2013-11-21 * ******************* * @param date * @param num * @return */ public Date addDate(Date date,int num) { Calendar startDate = Calendar.getInstance(); startDate.setTime(date); startDate.add(Calendar.DAY_OF_MONTH, num); return startDate.getTime(); } }
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <!-- test1包 --> <listener> <listener-class>com.weiyuanit.test1.MyListener</listener-class> </listener> </web-app>
可以去下载:java定时任务小例子
本文出自 “我的JAVA世界” 博客,请务必保留此出处http://hanchaohan.blog.51cto.com/2996417/1329591
相关文章推荐
- Struts2调用国际化的方式
- 引用SpringMVC时,事务,AOP等注解无效的解决办法
- Java7新特性(二)IO
- 在Java中为什么String不可变
- 在Java中如何通过反射找到一个变量,这个变量的类型是指定的类型
- java实现各种基础排序(冒泡排序、快速排序、直接选择排序、堆排序、直接插入排序、归并排序)
- java反射详解
- Java守护线程实例
- java基础学习—设计模式
- Java设计模式(二) 观察者模式
- web项目加入Struts,Hibernate,Spring后的运行机制
- Eclipse 4.x中Command是如何映射到Handler的
- viewpageindicator 加不到Eclipse Maven的原因
- java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]ResultSet can not re-read row dat
- java实现最大子序列问题——————性能最优的算法
- utils-求小数方法(java)
- JAVA小知识点小记
- eclipse常用快捷键
- 解决jar引用冲突问题
- 关于andriod apns消息推送框架pushsharp正确运行