java中怎么實現(xiàn)定時功能?
我們可以使用Timer和TimerTask類在java中實現(xiàn)定時任務(wù),詳細說明如下:
1、基礎(chǔ)知識java.util.Timer一種線程設(shè)施,用于安排以后在后臺線程中執(zhí)行的任務(wù)。可安排任務(wù)執(zhí)行一次,或者定期重復(fù)執(zhí)行。此類是線程安全的:多個線程可以共享單個 Timer 對象而無需進行外部同步。java.util.TimerTask由 Timer 安排為一次執(zhí)行或重復(fù)執(zhí)行的任務(wù)。
2、示例代碼該示例實現(xiàn)這樣一個功能,在系統(tǒng)運行期間,每30分鐘,系統(tǒng)自動檢查連接池中的可用連接數(shù),并輸出到日志中。首先創(chuàng)建一個需要定時執(zhí)行的任務(wù)類,這個任務(wù)類需要繼承TimerTask,然后重寫run()方法,run()方法體中的代碼就是定時需要執(zhí)行的操作,在本demo中,就是獲取連接池中當(dāng)前可用連接數(shù),并輸出到日志中,具體實現(xiàn)代碼如下:public class TaskAvailableConnectNumber extends TimerTask { private Logger log = Logger.getLogger(TaskAvailableConnectNumber.class); private ConnectionPool pool=ConnectionPool.getInstance(); @Override publicvoid run() { log.debug("當(dāng)前連接池中可用連接數(shù)"+pool.getAvailableConnectNumber()); }}下面定義一個監(jiān)聽器,負(fù)責(zé)在應(yīng)用服務(wù)器啟動時打開定時器,監(jiān)聽器需要實現(xiàn)ServletContextListener接口,并重寫其中的contextInitialized()和contextDestroyed()方法,代碼如下:public class OnLineListener implements ServletContextListener{ private Logger log = Logger.getLogger(OnLineListener.class); Timer timer = null; //在應(yīng)用服務(wù)器啟動時,會執(zhí)行該方法 publicvoid contextInitialized(ServletContextEvent arg0) { //創(chuàng)建一個定時器,用于安排需要定時執(zhí)行的任務(wù)。 timer = new Timer(); //為定時器安排需要定時執(zhí)行的任務(wù),該任務(wù)就是前面創(chuàng)建的任務(wù)類TaskAvailableConnectNumber,并指定該任務(wù)每30分鐘執(zhí)行一次。 timer.schedule(new TaskAvailableConnectNumber(), 0, 30*60*1000); log.debug("啟動定時器"); } //應(yīng)用服務(wù)器關(guān)閉時,會執(zhí)行該方法,完成關(guān)閉定時器的操作。public void contextDestroyed(ServletContextEvent arg0) { if(timer!=null){ timer.cancel();//關(guān)閉定時器 log.debug("-----定時器銷毀--------"); } }}監(jiān)聽器要想正常運行,需要在web.xml文件中進行配置,配置信息如下:<!-- 監(jiān)聽器配置開始 --> <listener> <listener-class> cn.sdfi.listen.OnLineListener </listener-class> </listener><!-- 監(jiān)聽器配置結(jié)束 -->以上步驟完成后,一個簡單的定時器就算開發(fā)完成了。