java中实现定时功能
網(wǎng)上資料:
我們可以使用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中,就是獲取連接池中當前可用連接數(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("當前連接池中可用連接數(shù)"+pool.getAvailableConnectNumber());
}
}
下面定義一個監(jiān)聽器,負責在應(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ā)完成了。
總結(jié)
以上是生活随笔為你收集整理的java中实现定时功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: testNG之参数化测试
- 下一篇: 宿主机ping不通虚拟机cenos7