成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

使用ScheduledThreadPoolExecutor需要注意的問(wèn)題

30e8336b8229 / 1285人閱讀

摘要:但在使用這兩個(gè)類的時(shí)候,要特別注意異常處理問(wèn)題。否則,只能通過(guò)執(zhí)行程序的取消或終止方法來(lái)終止該任務(wù)。看到這里,我們明白了原因,這樣就需要把方法的所有可能異常捕獲,才能保證定時(shí)任務(wù)繼續(xù)執(zhí)行。

玩過(guò)linux系統(tǒng)的同學(xué),應(yīng)該都知道cron是一個(gè)linux下的定時(shí)執(zhí)行工具,一些重要的任務(wù)的定時(shí)執(zhí)行可以通過(guò)cron來(lái)實(shí)現(xiàn),例如每天凌晨1點(diǎn)備份數(shù)據(jù)等。在JAVA WEB開(kāi)發(fā)中,我們也經(jīng)常需要用到定時(shí)執(zhí)行任務(wù)的功能,JDK提供了Timer類與ScheduledThreadPoolExecutor類實(shí)現(xiàn)這個(gè)定時(shí)功能。但在使用這兩個(gè)類的時(shí)候,要特別注意異常處理問(wèn)題。以下是一個(gè)模擬程序:

public class ScheduledThreadPoolExecutorTest {
    public static void main(String[] args) {
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1);
        BusinessTask task = new BusinessTask();
        //1秒后開(kāi)始執(zhí)行任務(wù),以后每隔2秒執(zhí)行一次
        executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS);
    }

    private static class BusinessTask implements Runnable{
        @Override
        public void run() { 
            System.out.println("任務(wù)開(kāi)始...");
            //doBusiness();
            System.out.println("任務(wù)結(jié)束...");
        }
    }
}

程序輸出結(jié)果跟相像中一樣:

  

任務(wù)開(kāi)始...
任務(wù)結(jié)束...
任務(wù)開(kāi)始...
任務(wù)結(jié)束...

可是執(zhí)行了一段時(shí)間后,發(fā)現(xiàn)定時(shí)任務(wù)不再執(zhí)行了,去查看后臺(tái)打印的日志,原來(lái)在doBusiness()方法中拋出了異常。為什么doBusiness()拋出異常就會(huì)中止定時(shí)任務(wù)的執(zhí)行呢?去查看JDK的ScheduledThreadPoolExecutor.scheduleWithFixedDelay(Runnable command,long initialDelay,long delay,TimeUnit unit)的方法說(shuō)明:

  

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.

這段話翻譯成中文是:

  

創(chuàng)建并執(zhí)行一個(gè)在給定初始延遲后首次啟用的定期操作,隨后,在每一次執(zhí)行終止和下一次執(zhí)行開(kāi)始之間都存在給定的延遲。如果任務(wù)的任一執(zhí)行遇到異常,就會(huì)取消后續(xù)執(zhí)行。否則,只能通過(guò)執(zhí)行程序的取消或終止方法來(lái)終止該任務(wù)。

看到這里,我們明白了原因,這樣就需要把doBusiness()方法的所有可能異常捕獲,才能保證定時(shí)任務(wù)繼續(xù)執(zhí)行。把代碼改成這樣:

public class ScheduledThreadPoolExecutorTest {
    public static void main(String[] args) {
        ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1);
        BusinessTask task = new BusinessTask();
        //1秒后開(kāi)始執(zhí)行任務(wù),以后每隔2秒執(zhí)行一次
        executorService.scheduleWithFixedDelay(task, 1000, 2000,TimeUnit.MILLISECONDS);
    }

    private static class BusinessTask implements Runnable{
        @Override
        public void run() { 
            //捕獲所有的異常,保證定時(shí)任務(wù)能夠繼續(xù)執(zhí)行
            try{
                System.out.println("任務(wù)開(kāi)始...");
                //doBusiness();
                System.out.println("任務(wù)結(jié)束...");
            }catch (Throwable e) {
                // donothing
            }
        }
    }
}

其實(shí),在JAVAWEB開(kāi)發(fā)中,執(zhí)行定時(shí)任務(wù)有一個(gè)更好的選擇:Quartz

這個(gè)開(kāi)源庫(kù)提供了豐富的作業(yè)調(diào)度集,有興趣的同學(xué)可以到官方網(wǎng)站中學(xué)習(xí)一下其用法。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64025.html

相關(guān)文章

  • ScheduledThreadPoolExecutor詳解

    摘要:該方法傳入表示如果當(dāng)前任務(wù)正在執(zhí)行,那么立即終止其執(zhí)行傳入表示如果當(dāng)前方法正在執(zhí)行,那么等待其執(zhí)行完成之后再取消當(dāng)前任務(wù)。 ???????本文主要分為兩個(gè)部分,第一部分首先會(huì)對(duì)ScheduledThreadPoolExecutor進(jìn)行簡(jiǎn)單的介紹,并且會(huì)介紹其主要API的使用方式,然后介紹了其使用時(shí)的注意點(diǎn),第二部分則主要對(duì)ScheduledThreadPoolExecutor的實(shí)現(xiàn)細(xì)節(jié)...

    wangshijun 評(píng)論0 收藏0
  • ScheduledThreadPoolExecutor詳解

    摘要:該方法傳入表示如果當(dāng)前任務(wù)正在執(zhí)行,那么立即終止其執(zhí)行傳入表示如果當(dāng)前方法正在執(zhí)行,那么等待其執(zhí)行完成之后再取消當(dāng)前任務(wù)。 ???????本文主要分為兩個(gè)部分,第一部分首先會(huì)對(duì)ScheduledThreadPoolExecutor進(jìn)行簡(jiǎn)單的介紹,并且會(huì)介紹其主要API的使用方式,然后介紹了其使用時(shí)的注意點(diǎn),第二部分則主要對(duì)ScheduledThreadPoolExecutor的實(shí)現(xiàn)細(xì)節(jié)...

    546669204 評(píng)論0 收藏0
  • ScheduledThreadPoolExecutor詳解

    摘要:該方法傳入表示如果當(dāng)前任務(wù)正在執(zhí)行,那么立即終止其執(zhí)行傳入表示如果當(dāng)前方法正在執(zhí)行,那么等待其執(zhí)行完成之后再取消當(dāng)前任務(wù)。 ???????本文主要分為兩個(gè)部分,第一部分首先會(huì)對(duì)ScheduledThreadPoolExecutor進(jìn)行簡(jiǎn)單的介紹,并且會(huì)介紹其主要API的使用方式,然后介紹了其使用時(shí)的注意點(diǎn),第二部分則主要對(duì)ScheduledThreadPoolExecutor的實(shí)現(xiàn)細(xì)節(jié)...

    gself 評(píng)論0 收藏0
  • Java調(diào)度線程池ScheduledThreadPoolExecutor源碼分析

    摘要:當(dāng)面試官問(wèn)線程池時(shí),你應(yīng)該知道些什么一執(zhí)行流程與不同,向中提交任務(wù)的時(shí)候,任務(wù)被包裝成對(duì)象加入延遲隊(duì)列并啟動(dòng)一個(gè)線程。當(dāng)我們創(chuàng)建出一個(gè)調(diào)度線程池以后,就可以開(kāi)始提交任務(wù)了。 最近新接手的項(xiàng)目里大量使用了ScheduledThreadPoolExecutor類去執(zhí)行一些定時(shí)任務(wù),之前一直沒(méi)有機(jī)會(huì)研究這個(gè)類的源碼,這次趁著機(jī)會(huì)好好研讀一下。 原文地址:http://www.jianshu....

    kohoh_ 評(píng)論0 收藏0
  • Java調(diào)度線程池ScheduledThreadPoolExecutor源碼分析

    摘要:當(dāng)面試官問(wèn)線程池時(shí),你應(yīng)該知道些什么一執(zhí)行流程與不同,向中提交任務(wù)的時(shí)候,任務(wù)被包裝成對(duì)象加入延遲隊(duì)列并啟動(dòng)一個(gè)線程。當(dāng)我們創(chuàng)建出一個(gè)調(diào)度線程池以后,就可以開(kāi)始提交任務(wù)了。 最近新接手的項(xiàng)目里大量使用了ScheduledThreadPoolExecutor類去執(zhí)行一些定時(shí)任務(wù),之前一直沒(méi)有機(jī)會(huì)研究這個(gè)類的源碼,這次趁著機(jī)會(huì)好好研讀一下。 原文地址:http://www.jianshu....

    cheukyin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<