摘要:但在使用這兩個類的時候,要特別注意異常處理問題。否則,只能通過執行程序的取消或終止方法來終止該任務??吹竭@里,我們明白了原因,這樣就需要把方法的所有可能異常捕獲,才能保證定時任務繼續執行。
玩過linux系統的同學,應該都知道cron是一個linux下的定時執行工具,一些重要的任務的定時執行可以通過cron來實現,例如每天凌晨1點備份數據等。在JAVA WEB開發中,我們也經常需要用到定時執行任務的功能,JDK提供了Timer類與ScheduledThreadPoolExecutor類實現這個定時功能。但在使用這兩個類的時候,要特別注意異常處理問題。以下是一個模擬程序:
public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1); BusinessTask task = new BusinessTask(); //1秒后開始執行任務,以后每隔2秒執行一次 executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS); } private static class BusinessTask implements Runnable{ @Override public void run() { System.out.println("任務開始..."); //doBusiness(); System.out.println("任務結束..."); } } }
程序輸出結果跟相像中一樣:
任務開始...
任務結束...
任務開始...
任務結束...
可是執行了一段時間后,發現定時任務不再執行了,去查看后臺打印的日志,原來在doBusiness()方法中拋出了異常。為什么doBusiness()拋出異常就會中止定時任務的執行呢?去查看JDK的ScheduledThreadPoolExecutor.scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)的方法說明:
Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with the given delay between the termination of one execution and the commencement of the next. If any execution of the task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor.
這段話翻譯成中文是:
創建并執行一個在給定初始延遲后首次啟用的定期操作,隨后,在每一次執行終止和下一次執行開始之間都存在給定的延遲。如果任務的任一執行遇到異常,就會取消后續執行。否則,只能通過執行程序的取消或終止方法來終止該任務。
看到這里,我們明白了原因,這樣就需要把doBusiness()方法的所有可能異常捕獲,才能保證定時任務繼續執行。把代碼改成這樣:
public class ScheduledThreadPoolExecutorTest { public static void main(String[] args) { ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1); BusinessTask task = new BusinessTask(); //1秒后開始執行任務,以后每隔2秒執行一次 executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS); } private static class BusinessTask implements Runnable{ @Override public void run() { //捕獲所有的異常,保證定時任務能夠繼續執行 try{ System.out.println("任務開始..."); //doBusiness(); System.out.println("任務結束..."); }catch (Throwable e) { // donothing } } } }
其實,在JAVAWEB開發中,執行定時任務有一個更好的選擇:Quartz
這個開源庫提供了豐富的作業調度集,有興趣的同學可以到官方網站中學習一下其用法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64025.html
摘要:該方法傳入表示如果當前任務正在執行,那么立即終止其執行傳入表示如果當前方法正在執行,那么等待其執行完成之后再取消當前任務。 ???????本文主要分為兩個部分,第一部分首先會對ScheduledThreadPoolExecutor進行簡單的介紹,并且會介紹其主要API的使用方式,然后介紹了其使用時的注意點,第二部分則主要對ScheduledThreadPoolExecutor的實現細節...
摘要:該方法傳入表示如果當前任務正在執行,那么立即終止其執行傳入表示如果當前方法正在執行,那么等待其執行完成之后再取消當前任務。 ???????本文主要分為兩個部分,第一部分首先會對ScheduledThreadPoolExecutor進行簡單的介紹,并且會介紹其主要API的使用方式,然后介紹了其使用時的注意點,第二部分則主要對ScheduledThreadPoolExecutor的實現細節...
摘要:該方法傳入表示如果當前任務正在執行,那么立即終止其執行傳入表示如果當前方法正在執行,那么等待其執行完成之后再取消當前任務。 ???????本文主要分為兩個部分,第一部分首先會對ScheduledThreadPoolExecutor進行簡單的介紹,并且會介紹其主要API的使用方式,然后介紹了其使用時的注意點,第二部分則主要對ScheduledThreadPoolExecutor的實現細節...
摘要:當面試官問線程池時,你應該知道些什么一執行流程與不同,向中提交任務的時候,任務被包裝成對象加入延遲隊列并啟動一個線程。當我們創建出一個調度線程池以后,就可以開始提交任務了。 最近新接手的項目里大量使用了ScheduledThreadPoolExecutor類去執行一些定時任務,之前一直沒有機會研究這個類的源碼,這次趁著機會好好研讀一下。 原文地址:http://www.jianshu....
摘要:當面試官問線程池時,你應該知道些什么一執行流程與不同,向中提交任務的時候,任務被包裝成對象加入延遲隊列并啟動一個線程。當我們創建出一個調度線程池以后,就可以開始提交任務了。 最近新接手的項目里大量使用了ScheduledThreadPoolExecutor類去執行一些定時任務,之前一直沒有機會研究這個類的源碼,這次趁著機會好好研讀一下。 原文地址:http://www.jianshu....
閱讀 2989·2023-04-25 21:23
閱讀 3022·2021-09-22 15:24
閱讀 862·2019-08-30 12:55
閱讀 2095·2019-08-29 18:42
閱讀 2607·2019-08-29 16:27
閱讀 943·2019-08-26 17:40
閱讀 2173·2019-08-26 13:29
閱讀 2604·2019-08-26 11:45