Java定时任务的简单实现

简介:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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();
         }
     }
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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();
     }
                     
}



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?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定时任务小例子



     本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/1329591,如需转载请自行联系原作者





相关文章
|
8月前
|
设计模式 Java
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
26、Java 简单实现单例设计模式(饿汉式和懒汉式)
61 2
|
8月前
|
缓存 NoSQL Java
java中实现定时给微信群中发送每日简报
java中实现定时给微信群中发送每日简报
|
3月前
|
Java 调度
Java实现定时启动,且只执行一次,如何实现?
【10月更文挑战第18天】Java实现定时启动,且只执行一次,如何实现?
376 3
|
3月前
|
Java
用java搞定时任务,将hashmap里面的值存到文件里面去
本文介绍了如何使用Java的`Timer`和`TimerTask`类创建一个定时任务,将HashMap中的键值对写入到文本文件中,并提供了完整的示例代码。
49 1
用java搞定时任务,将hashmap里面的值存到文件里面去
|
7月前
|
Java jenkins 持续交付
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
Java项目jar包启动脚本,适用jenkins或定时任务或手动执行
388 3
|
3月前
|
监控 Java
Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
【10月更文挑战第13天】Java定时扫码一个文件夹下的文件,如何保证文件写入完成后才进行处理?
176 1
|
3月前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
182 1
|
5月前
|
存储 运维 Java
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
Java 调度
java定时任务3分钟一次
7月更文挑战第6天
258 1
|
6月前
|
负载均衡 Java 调度
Java中的定时任务实现详解
Java中的定时任务实现详解