使用TimerTask的坑
生活随笔
收集整理的這篇文章主要介紹了
使用TimerTask的坑
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
使用TimerTask可以方便的實現定時任務的功能,但是如果使用不當,反而會帶來隱患。
在使用TimerTask時,TimerTask中的代碼必須要做異常處理,否則產生異常的時候,就掛掉了。
特別像使用MQ發送數據的時候,不會顯式的要求你捕獲異常,如果你忘記了,那么在某個時刻MQ異常的時候(比如網絡異常),在發送數據到MQ失敗的時候,TimerTask就掛掉了。
比如如下代碼:
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext_*.xml"); final JmsSender jmsSender = ac.getBean(JmsSender.class); Timer timer = new Timer(); // 1.TimerTask中不處理異常 timer.schedule(new TimerTask() {@Overridepublic void run() {System.out.println("開始發送數據");jmsSender.sendTopicMsg("test.topic","hello,world");System.out.println("數據發送成功");} },10000,5000);這段代碼沒有做異常處理,我們看下執行結果:
最開始啟動程序時,讓MQ正常啟動起來,這個時候TimerTask是正常工作的;在某個時刻關閉MQ,這個時候發現TimerTask中已經沒有打印任何東西了,包括后面MQ恢復了也沒有再打印,說明TimerTask已經掛掉了。
所以在使用TimerTask的時候要尤其注意這點,搞不好就踩著坑了。
處理方法有這么幾種:
1.仍然使用TimerTask,但做異常處理;
2.使用單一線程的線程池來做;
3.使用線程,同樣做異常處理。
總結
以上是生活随笔為你收集整理的使用TimerTask的坑的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FileZilla打开连接后本地站点无法
- 下一篇: 5g网络测试用什么软件,5G 来袭 —