計劃調度定時任務的方法
2023-12-07 07:11:26
專利名稱:計劃調度定時任務的方法
技術領域:
本發明涉及通訊領域,尤其涉及一種計劃調度定時任務的方法。
背景技術:
隨著信息技術的發展,計劃調度任務的需求越來越廣泛,如,企業需要計劃調度每目的目志或者晚間批處理過程;用戶需要根據約定計劃調度鬧鈴時間,等等。
與本發明相關的現有技術一,是基於Java應用程式實現任務的計劃調度的技術方案,在該方案中引入了定時器框架,使用該定時器框架能夠使程式設計師比較容易地計劃簡單的任務。在所述Java定時器框架中使用一個隊列存放所有定時任務,使用一個後臺線程完成所有任務的調度與執行。其處理流程如圖1所示,包括步驟S101、主線程註冊定時任務,指定開始時間,時間間隔;步驟S102、將後臺線程從等待狀態喚醒,之後結束主線程;當所述後臺線程從等待狀態被喚醒後,其執行步驟S103,即所述後臺線程從任務隊列中取出一個執行時間最早的定時任務;步驟S104、所述後臺線程判斷所述取出的定時任務的執行時間是否大於所述當前時間,若是,則執行步驟S105,即等待,等待時間為執行時間減去當前時間,然後轉入步驟S103;否則,執行步驟S106,即執行所述定時任務;然後執行步驟S107;步驟S107、判斷所述取出的定時任務是否需要重複執行,若需要重複執行,則執行步驟S108,即修改所述定時任務的執行時間,即將當前執行時間加上設定的時間間隔,然後用修改後的執行時間更新所述定時任務的執行時間,然後轉入步驟S103;如果不需要重複執行,即確認所述定時任務為單次任務時,則執行步驟S109,即將所述單次定時任務從任務隊列中刪除,然後轉入步驟S103。
由現有技術的技術方案可以看出,由於現有技術通過指定一個固定的執行時間間隔來實現重複執行的定時任務,因而其存在如下缺陷1、無法實現任意複雜的定時任務的計劃調度,缺乏靈活性;2、即使對每天同一時刻執行的任務,也會因為在夏令時開始和結束時出現時間跳躍;3、當中途進行系統時間修正時,定時器無法感知,仍按照修正前的時間進行調度;4、使用單一的後臺線程調度並執行所有定時任務,處理能力弱,當執行某個任務耗費時間比較多時,容易產生時間漂移,即容易延遲其它任務的執行;5、支持的定時任務數目少。
發明內容
鑑於上述現有技術所存在的問題,本發明的目的是提供一種計劃調度定時任務的方法,通過該方法,能夠支持任意複雜的計劃調度,如每天同一時刻執行任務、每周某幾天同一時刻執行任務、每月某幾天同一時刻執行任務等等,因而比較靈活;通過該方法,當使用日曆時,從而屏蔽了夏令時的影響;當中途進行系統時間修正時,下一次的調度能夠按照修正後的系統時間進行;通過該方法引入的線程池技術,能夠並發處理定時任務,一方面提高了處理能力,另一方面不會延遲其他任務的執行;而且本發明能夠支持更多數量的定時任務。
本發明的目的是通過以下技術方案實現的本發明提供的一種計劃調度定時任務的方法,包括A、基於定時迭代器,通過至少兩個線程調度並執行計劃調度的定時任務。
其中,所述步驟A具體包括A1、後臺線程從任務隊列中獲取執行時間最早的定時任務;A2、判斷所述獲取的定時任務的執行時間是否大於當前時間,若大於,則所述線程進入等待狀態,當等待時間到時,執行步驟A3;否則直接執行步驟A3;A3、判斷是否能夠獲取到所述定時任務的下次執行時間,若是,則從所述定時迭代器中獲取所述定時任務的下次執行時間,並根據所述獲取的下次執行時間更新所述定時任務的執行時間,然後執行步驟A4;否則,刪除任務隊列中的所述定時任務,然後執行步驟A4;A4、喚醒線程池中的後臺線程,並執行所述獲取的定時任務,然後轉入步驟A1。
其中,在所述步驟A1之前包括A5、主線程指定定時迭代器,並將計劃調度的定時任務放入任務隊列中,然後喚醒線程池中的後臺線程;A6、所述線程池中的後臺線程通過競爭,只有一個後臺線程獲取調度定時任務的權利。
其中,所述步驟A1具體包括A11、後臺線程判斷所述任務隊列是否為空,當確認所述任務隊列不為空時,則執行步驟A12;否則,繼續執行步驟A11;A12、從所述任務隊列中獲取執行時間最早的定時任務。
其中,所述步驟A4還包括所述被喚醒的後臺線程通過競爭,只有一個後臺線程獲取調度定時任務的權利,然後轉入步驟A1。
其中,所述步驟A具體包括A7、所述主線程根據註冊的定時任務,從所述指定的定時迭代器中獲取所述定時任務的執行時間,並根據所述獲取的執行時間在定時器框架中註冊單次執行的任務;A8、定時觸發所述定時框架,將其內所述註冊的單次執行的定時任務放入後臺線程池的任務隊列中,由所述後臺線程對所述放入任務隊列中的定時任務進行處理;A9、當從定時迭代器中獲取到所述定時任務的下一次執行時間時,根據所述獲取的下一次執行時間向所述定時框架中註冊單次執行的任務。
其中,在所述步驟A7之前包括A10、主線程註冊定時任務,並指定定時迭代器。
其中,步驟A8中所述後臺線程對所述放入任務隊列中的定時任務進行處理的過程具體包括A81、通過所述後臺線程池中的線程的競爭,只有一個後臺線程獲取調度定時任務的權利;A82、所述獲取調度定時任務的權利的後臺線程,調度並執行所述放入任務隊列中的定時任務,當執行完畢後,刪除所述定時任務。
其中,所述步驟A9具體包括A91、判斷是否能夠從定時迭代器中獲取到所述定時任務的下一次執行時間,若是,則根據所述獲取的下一次執行時間向所述定時框架中註冊單次執行的任務;否則,結束此步驟。
由上述本發明提供的技術方案可以看出,本發明所述的方法基於定時迭代器,通過至少兩個線程調度並執行計劃調度的定時任務。通過本發明將計劃以定時迭代器的方式獨立出來,便於實現任意複雜的計劃;而且在實現定時達代器時使用日曆算法,消除了夏令時的偏差,解決夏令時修正問題;當使用定時迭代器之後,每一次迭代都按照當前的系統時間進行計算,所以能夠不受中途修正系統時間的影響,及時感知系統時間的修正,保證了計劃的準確性;另外,本發明引入線程池技術,從根本上解決時間漂移問題,並且大大提高計劃調度以及執行任務的能力,從而能夠容納更多的定時任務。
圖1為現有技術的流程圖;圖2為本發明提供的第一實施例的流程圖;圖3為本發明提供的第二實施例的流程圖。
具體實施例方式
本發明提供了一種計劃調度定時任務的方法,其主要思路是通過提供一個預定義的時間序列來實現任意複雜的計劃,該時間序列是一個個將要觸發任務執行的時間點,由定時迭代器產生。在註冊定時任務時,只要指定定時迭代器,就等於指定了執行定時任務的計劃。另外通過引入線程池技術,也就是說使用多個後臺線程並發執行定時任務,從根本上解決時間漂移問題。
本發明的核心是基於定時迭代器,通過至少兩個線程調度並執行計劃調度的定時任務。
本發明提供的第一實施例,如圖2所示,包括步驟S201,主線程註冊定時任務,指定定時迭代器;並將定時任務放入任務隊列。
步驟S202、將所有處於等待狀態的後臺線程喚醒,之後結束主線程。
步驟S203、所述被喚醒的後臺線程參與線程競爭,只有一個後臺線程獲取調度定時任務的權利。
當確認所述任務隊列不為空時執行步驟S204,即所述獲取調度定時任務的權利的後臺線程從所述任務隊列中取出執行時間最早的定時任務;步驟S205、判斷所述取出的定時任務的執行時間是否大於當前時間,若大於當前時間,則執行步驟S206,即等待,等待時間為執行時間減去當前時間,然後轉入步驟S207;否則,直接執行步驟S207。
步驟S207、判斷是否能夠從所述定時迭代器中獲取到任務的下次執行時間。
如果能夠從所述定時迭代器中獲取到任務的下次執行時間,則表明該任務為重複執行的任務,不需要被取消,於是執行步驟S208,即從定時迭代器中獲取任務的下次執行時間;然後執行步驟S209,即用所述獲取到的下次執行時間去更新所述定時任務的執行時間;然後執行步驟S211;如果不能夠從所述定時迭代器中獲取到任務的下次執行時間,則確定該任務為單次執行的任務或重複執行的任務已經結束,則需要被取消,於是執行步驟S210,即將所述定時任務從任務隊列中刪除,然後轉入步驟S211。
步驟S211,喚醒其它所有後臺線程(其它後臺線程轉入步驟S203,即去參與線程競爭),然後執行步驟S212。
步驟S212,所述後臺線程執行所述獲取的定時任務。當執行完畢後,轉入步驟S203,即繼續與其它後臺線程參與線程競爭。
在上述本發明的技術方案中,所有的定時迭代器都提供一個相同的接口供計劃調度框架調用,所述定時迭代器的本質是一個用日期表示的時間點序列,可以通過各種算法來定義任意複雜的計劃。下面舉例說明需要在一個每天固定時間執行任務的定時迭代器的實現方法假設定時任務需要在每天早上9點執行,當計劃調度框架調用接口方法獲取下一次執行時間時,定時迭代器根據日曆算法,在本次執行時間的基礎上加上一天,這樣就得到了第二天的執行時間。當需要夏令時修正時,所述定時迭代器通過日曆算法進行處理。
由上述本發明的技術方案可以看出當本發明執行到步驟S211時,其它後臺線程被喚醒,參與線程競爭後,其中的一個線程獲取調度定時任務的權利,開始調度並執行所述定時任務;由於當前線程處理定時任務需要一定時間,這與任務的複雜程度有關,而另一線程完成調度後也可能馬上開始調度並執行定時任務,如果是這樣,那麼此時就有兩個後臺線程同時執行定時任務。以此類推,本發明引入線程池技術,從根本上解決了時間漂移的問題,並且大大提高了計劃調度以及執行任務的能力。
本發明提供的第二實施例,利用現有技術中的Java定時器框架提供的單次調度能力,使用線程池執行定時任務,同樣能夠達到本發明的目的。具體實施過程如圖3所示,包括步驟S301,主線程註冊定時任務,並指定定時迭代器。
步驟S302,所述主線程從所述指定的定時迭代器中獲取定時任務的執行時間。
步驟S303,所述主線程根據所述獲取的下次執行時間在定時器框架中,如Java定時器框架中,註冊一個單次執行的任務;然後結束。
步驟S304,通過所述定時框架中的Timer(計時器)定時觸發,將所述定時框架中的所述註冊的單次執行的定時任務放入後臺線程池的任務隊列中,由後臺線程進行處理,然後執行步驟S305。
步驟304中,當將所述定時框架中的所述註冊的單次執行的定時任務放入後臺線程池的任務隊列中,由後臺線程進行處理後,所述後臺線程對任務隊列中的定時任務進行處理的過程具體包括所述後臺線程池通過競爭,只有其中一個線程獲取定時任務的執行權,其開始調度執行所述放入任務隊列中的定時任務,執行完畢後,刪除所述定時任務。
步驟S305,判斷是否能夠獲取到所述任務的下一次執行時間,若能夠獲取下一次執行時間,則表明所述任務為重複執行的任務,於是執行步驟S306,即從定時迭代器中獲取下一次執行時間,並根據所述獲取的下一次執行時間向所述定時框架中註冊單次執行的任務;如果獲取不到下一次執行時間,則表明所述任務為單次執行的任務或重複執行的任務已經結束,於是執行步驟S307,即結束此步驟。
由上述本發明的提供的技術方案可以看出,本發明將計劃以定時迭代器的方式獨立出來,便於實現任意複雜的計劃;而且在實現定時迭代器時使用日曆算法,消除了夏令時的偏差,解決夏令時修正問題;當使用定時迭代器之後,每一次迭代都按照當前的系統時間進行計算,所以能夠不受中途修正系統時間的影響,及時感知系統時間的修正,保證了計劃的準確性;另外,本發明引入線程池技術,從根本上解決時間漂移問題,並且大大提高計劃調度以及執行任務的能力,從而能夠容納更多的定時任務。
以上所述,僅為本發明較佳的具體實施方式
,但本發明的保護範圍並不局限於此,任何熟悉本技術領域的技術人員在本發明揭露的技術範圍內,可輕易想到的變化或替換,都應涵蓋在本發明的保護範圍之內。因此,本發明的保護範圍應該以權利要求的保護範圍為準。
權利要求
1.一種計劃調度定時任務的方法,其特徵在於,包括A、基於定時迭代器,通過至少兩個線程調度並執行計劃調度的定時任務。
2.根據權利要求1所述的方法,其特徵在於,所述步驟A具體包括A1、後臺線程從任務隊列中獲取執行時間最早的定時任務;A2、判斷所述獲取的定時任務的執行時間是否大於當前時間,若大於,則所述線程進入等待狀態,當等待時間到時,執行步驟A3;否則直接執行步驟A3;A3、判斷是否能夠獲取到所述定時任務的下次執行時間,若能,則從所述定時迭代器中獲取所述定時任務的下次執行時間,並根據所述獲取的下次執行時間更新所述定時任務的執行時間,然後執行步驟A4;否則,刪除任務隊列中的所述定時任務,然後執行步驟A4;A4、喚醒線程池中的後臺線程,並執行所述獲取的定時任務,然後轉入步驟A1。
3.根據權利要求2所述的方法,其特徵在於,在所述步驟A1之前包括A5、主線程指定定時迭代器,並將計劃調度的定時任務放入任務隊列中,然後喚醒線程池中的後臺線程;A6、所述線程池中的後臺線程通過競爭,只有一個後臺線程獲取調度定時任務的權利。
4.根據權利要求2或3所述的方法,其特徵在於,所述步驟A1具體包括A11、後臺線程判斷所述任務隊列是否為空,當確認所述任務隊列不為空時,則執行步驟A12;否則,繼續執行步驟A11;A12、從所述任務隊列中獲取執行時間最早的定時任務。
5.根據權利要求4所述的方法,其特徵在於,所述步驟A4還包括所述被喚醒的後臺線程通過競爭,只有一個後臺線程獲取調度定時任務的權利,然後轉入步驟A1。
6.根據權利要求1所述的方法,其特徵在於,所述步驟A具體包括A7、所述主線程根據註冊的定時任務,從所述指定的定時迭代器中獲取所述定時任務的執行時間,並根據所述獲取的執行時間在定時器框架中註冊單次執行的任務;A8、定時觸發所述定時框架,將其內所述註冊的單次執行的定時任務放入後臺線程池的任務隊列中,由所述後臺線程對所述放入任務隊列中的定時任務進行處理;A9、當從定時迭代器中獲取到所述定時任務的下一次執行時間時,根據所述獲取的下一次執行時間向所述定時框架中註冊單次執行的任務。
7.根據權利要求6所述的方法,其特徵在於,在所述步驟A7之前包括A10、主線程註冊定時任務,並指定定時迭代器。
8.根據權利要求6所述的方法,其特徵在於,步驟A8中所述後臺線程對所述放入任務隊列中的定時任務進行處理的過程具體包括A81、通過所述後臺線程池中的線程的競爭,只有一個後臺線程獲取調度定時任務的權利;A82、所述獲取調度定時任務的權利的後臺線程,調度並執行所述放入任務隊列中的定時任務,當執行完畢後,刪除所述定時任務。
9.根據權利要求6所述的方法,其特徵在於,所述步驟A9具體包括A91、判斷是否能夠從定時迭代器中獲取到所述定時任務的下一次執行時間,若是,則根據所述獲取的下一次執行時間向所述定時框架中註冊單次執行的任務;否則,結束此步驟。
全文摘要
本發明涉及一種計劃調度定時任務的方法,其核心是基於定時迭代器,通過至少兩個線程調度並執行計劃調度的定時任務。通過本發明將計劃以定時迭代器的方式獨立出來,便於實現任意複雜的計劃;而且在實現定時迭代器時使用日曆算法,消除了夏令時的偏差,解決夏令時修正問題;當使用定時迭代器之後,每一次迭代都按照當前的系統時間進行計算,所以能夠不受中途修正系統時間的影響,及時感知系統時間的修正,保證了計劃的準確性;另外,本發明引入線程池技術,從根本上解決時間漂移問題,並且大大提高計劃調度以及執行任務的能力,從而能夠容納更多的定時任務。
文檔編號G06F9/46GK1862575SQ20051009090
公開日2006年11月15日 申請日期2005年8月19日 優先權日2005年8月19日
發明者張磊, 龔華 申請人:華為技術有限公司