天天看點

Java定時任務的簡單實作

<code>package</code> <code>com.weiyuanit.test1;</code>

<code>import</code> <code>java.util.Date;</code>

<code>import</code> <code>java.util.TimerTask;</code>

<code>/***********************</code>

<code> </code><code>* @author:han </code>

<code> </code><code>* @version:1.0     </code>

<code> </code><code>* @created:2013-11-20 </code>

<code> </code><code>***********************</code>

<code> </code><code>*/</code>

<code>public</code> <code>class</code> <code>MyTask </code><code>extends</code> <code>TimerTask {</code>

<code>    </code><code>@Override</code>

<code>    </code><code>public</code> <code>void</code> <code>run() {</code>

<code>        </code><code>//此處添加具體任務代碼</code>

<code>        </code><code>try</code> <code>{</code>

<code>            </code><code>System.out.println(</code><code>" =============== call at :"</code> <code>+ (</code><code>new</code> <code>Date()));</code>

<code>        </code><code>} </code><code>catch</code> <code>(Exception e) {</code>

<code>            </code><code>System.out.println(</code><code>"-------------解析資訊發生異常--------------"</code><code>);</code>

<code>            </code><code>e.printStackTrace();</code>

<code>        </code><code>}</code>

<code>    </code><code>}</code>

<code>}</code>

<code>import</code> <code>java.util.Calendar;</code>

<code>import</code> <code>java.util.Timer;</code>

<code>import</code> <code>javax.servlet.ServletContextEvent;</code>

<code>import</code> <code>javax.servlet.ServletContextListener;</code>

<code> </code><code>* 定時任務測試</code>

<code>public</code> <code>class</code> <code>MyListener </code><code>implements</code> <code>ServletContextListener{</code>

<code>    </code><code>private</code> <code>Timer timer = </code><code>null</code><code>;</code>

<code>                    </code> 

<code>    </code><code>//時間間隔</code>

<code>    </code><code>private</code> <code>static</code> <code>final</code> <code>long</code> <code>PERSIOD_DAY = </code><code>24</code> <code>* </code><code>60</code> <code>* </code><code>60</code> <code>* </code><code>1000</code><code>;</code>

<code>    </code><code>public</code> <code>void</code> <code>contextDestroyed(ServletContextEvent sce) {</code>

<code>        </code><code>// TODO Auto-generated method stub</code>

<code>        </code><code>timer.cancel();</code>

<code>    </code><code>public</code> <code>void</code> <code>contextInitialized(ServletContextEvent sce) {</code>

<code>        </code><code>timer = </code><code>new</code> <code>Timer(</code><code>true</code><code>);</code>

<code>        </code><code>//設定任務計劃,啟動和間隔時間</code>

<code>        </code><code>//timer.schedule(new MyTask(),0, 86400000);</code>

<code>                        </code> 

<code>        </code><code>MyTask myTask = </code><code>new</code> <code>MyTask();</code>

<code>        </code><code>//1.立刻開始執行myTask的任務,隻執行一次</code>

<code>//      timer.schedule(myTask, new Date());</code>

<code>        </code><code>//2.立刻開始執行myTask的任務,執行完本次任務,隔3秒再執行一次</code>

<code>//      timer.schedule(myTask, new Date(),3000);</code>

<code>        </code><code>//3.5秒鐘後開始執行myTask的任務,隻執行一次</code>

<code>//      timer.schedule(myTask, 5000);</code>

<code>        </code><code>//4.5秒鐘後開始執行myTask的任務,執行完本次任務後,隔3秒再執行一次</code>

<code>//      timer.schedule(myTask, 5000,3000);</code>

<code>        </code><code>//5.立刻開始執行myTask任務,每隔3秒再執行一次</code>

<code>//      timer.scheduleAtFixedRate(myTask, new Date(), 3000);</code>

<code>        </code><code>//6.秒鐘後開始執行myTask任務,每隔3秒執行一次</code>

<code>        </code><code>/**</code>

<code>         </code><code>* 需要注意的是scheduleAtFixedRate和schedule在參數完全相同的情況下,執行效果是不同的。</code>

<code>         </code><code>* 上面例子中任務隻是列印一個字元串,比較簡單。</code>

<code>         </code><code>* 但如果任務比較複雜,或者由于任何原因(如垃圾回收或其他背景活動)而延遲了某次執行,</code>

<code>         </code><code>* 則scheduleAtFixedRate方法将快速連續地出現兩次或更多的執行,進而使後續執行能夠“追趕上來”;</code>

<code>         </code><code>* 而schedule方法的後續執行也将被延遲。</code>

<code>         </code><code>* 是以,在長期運作中,scheduleAtFixedRate執行的頻率将正好是指定周期的倒數,schedule 執行的頻率一般要稍慢于指定周期的倒數。</code>

<code>                </code><code>另外,TimerTask的構造函數是protected,是以無法再類中直接new一個TimerTask,而隻能寫一個類繼承TimerTask。</code>

<code>         </code><code>*/</code>

<code>/*      try {</code>

<code>            </code><code>Thread.sleep(10000);</code>

<code>        </code><code>} catch (InterruptedException e) {</code>

<code>            </code><code>// TODO Auto-generated catch block</code>

<code>        </code><code>System.out.println(" 1 ");</code>

<code>        </code><code>//timer.cancel();//結束任務執行,程式并不終止</code>

<code>        </code><code>System.out.println(" 2 ");*/</code>

<code>        </code><code>//7.定制每日夜裡2:00執行方法</code>

<code>        </code><code>Calendar calendar = Calendar.getInstance();</code>

<code>        </code><code>calendar.set(Calendar.HOUR_OF_DAY, 14);</code>

<code>        </code><code>calendar.set(Calendar.MINUTE, 24);</code>

<code>        </code><code>calendar.set(Calendar.SECOND, 0);</code>

<code>        </code><code>//第一次執行定時任務的時間</code>

<code>        </code><code>Date date = calendar.getTime();</code>

<code>         </code><code>* 如果第一次執行定時任務的時間 小于 目前的時間,</code>

<code>         </code><code>* 此時要在 第一次執行定時任務的時間 加一天,以便此任務在下個時間點執行。</code>

<code>         </code><code>* 如果不加一天,任務會立即執行</code>

<code>        </code><code>if (date.before(new Date())) {</code>

<code>            </code><code>date = this.addDate(date, 1);</code>

<code>        </code><code>//timer.schedule(myTask, date,PERSIOD_DAY);</code>

<code>        </code><code>timer.schedule(myTask, date,5000);</code>

<code>         </code><code>* 注意事項:</code>

<code>         </code><code>* 一定要注意時間點的問題。如果你設定在淩晨2點執行任務。但你是在2點以後釋出程式</code>

<code>         </code><code>* 或是重新開機過服務。那這樣的情況下,任務會立即執行,而不是等到第二天的淩晨2點再執行。</code>

<code>         </code><code>* 為了避免這種情況發生,隻能判斷一下,如果釋出或重新開機服務的時間晚于定時執行任務的時間,</code>

<code>         </code><code>* 就在此基礎上加一天。</code>

<code>    </code><code>/**</code>

<code>     </code><code>* 增加或減少天數</code>

<code>     </code><code>* *******************</code>

<code>     </code><code>* @author: han</code>

<code>     </code><code>* 2013-11-21</code>

<code>     </code><code>* @param date</code>

<code>     </code><code>* @param num</code>

<code>     </code><code>* @return</code>

<code>     </code><code>*/</code>

<code>    </code><code>public</code> <code>Date addDate(Date date,</code><code>int</code> <code>num) {</code>

<code>        </code><code>Calendar startDate = Calendar.getInstance();</code>

<code>        </code><code>startDate.setTime(date);</code>

<code>        </code><code>startDate.add(Calendar.DAY_OF_MONTH, num);</code>

<code>        </code><code>return</code> <code>startDate.getTime();</code>

<code>&lt;?xml version=</code><code>"1.0"</code> <code>encoding=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;web-app version=</code><code>"2.5"</code>

<code>    </code><code>xmlns=</code><code>"http://java.sun.com/xml/ns/javaee"</code>

<code>    </code><code>xmlns:xsi=</code><code>"http://www.w3.org/2001/XMLSchema-instance"</code>

<code>    </code><code>xsi:schemaLocation="http:</code><code>//java.sun.com/xml/ns/javaee</code>

<code>    </code><code>http:</code><code>//java.sun.com/xml/ns/javaee/web-app_2_5.xsd"&gt;</code>

<code>  </code><code>&lt;display-name&gt;&lt;/display-name&gt;</code>

<code>  </code><code>&lt;welcome-file-list&gt;</code>

<code>    </code><code>&lt;welcome-file&gt;index.jsp&lt;/welcome-file&gt;</code>

<code>  </code><code>&lt;/welcome-file-list&gt;</code>

<code>            </code> 

<code>  </code><code>&lt;!-- test1包 --&gt;</code>

<code>  </code><code>&lt;listener&gt;</code>

<code>    </code><code>&lt;listener-</code><code>class</code><code>&gt;com.weiyuanit.test1.MyListener&lt;/listener-</code><code>class</code><code>&gt;</code>

<code>  </code><code>&lt;/listener&gt;</code>

<code>&lt;/web-app&gt;</code>

可以去下載下傳:java定時任務小例子

<b>     本文轉自韓立偉 51CTO部落格,原文連結:http://blog.51cto.com/hanchaohan/1329591</b><b>,如需轉載請自行聯系原作者</b>