天天看點

用不定進制的數字加法系統實作定時執行功能

unix下有cron程式來實作定時執行的功能,但cron的實作是每分鐘被喚醒後檢查一下,目前是否有需要執行的任務,這種實作方案當然很簡單也很可靠,但看起來實在太笨,筆者這樣自诩“聰明”的人就想換個更節省資源的方案來實作。

首先實作了一個任務隊列,其每一個任務節點主要包括兩個部分,一是節點秒數,意為從上一個節點到本節點的時間間隔;二是需執行的任務。

當需要設定某個時鐘任務時:

1、将所有需要按時執行的任務和目前時間比較一下,得到其從現在開始多少秒後開始執行,稱為S;

2、從任務隊列的頭一直向後搜尋,對于每一個任務節點,首先比較S和節點秒數sn,如果sn<S,那麼另S=S-sn,然後繼續搜尋下一個節點;

3、如果S==sn,那麼就将該任務添加到目前任務節點的action中;

4、如果S<sn,那麼就生成一個新的任務節點,另其節點秒數為S,然後将其插入到任務隊列目前任務節點(sn)之前,同時修改目前任務節點的節點秒數sn=sn-S。

該任務隊列每次觸發後将頭節點的節點秒數減一,即s0=s0-1,如果s0等于0那麼就删除該頭節點,同時異步執行其action。

有了這個任務隊列,那麼定時器就是計算出下一次應該執行的時間點,然後将其插入到任務隊列中即可。是以cron功能就轉換為依次取定時器的下一次觸發的時間點。要實作根據指定的年月日時分的設定來确定下一個有效時間,如果沒有合理的構造會比較麻煩,筆者将其抽象為5位的數字系統,這個數字系統的基礎是5個不定進制數的串聯,所謂的不定進制,就是說要打破我們平常所司空見慣的十進制、二進制的概念,而是将使用者所指定的時間值作為進制基礎,指定了幾個數字就是幾位,然後實作了這個不定進制數的加法系統,其實就是加一運算,溢出後歸"0"并進一。舉個例子來進行說明:

比如,我們想在每個月的1号、11号、21号、31号的5點、15點的9分執行某動作,那麼這個數字系統的設定就是:

年:2011-3000所組成的990進制數,年位溢出則數字肯定無效;

月:1-12組成的12進制數;

日:1、11、21、31這四個數所組成的四進制數(即取值就是這四個數之一,而且1加一等于11、11加一等于21、21加一等于31、31加一等于1同時需向月位進一);

時:5、15所組成的兩進制數(5加一等于15、15加一等于5同時需向日位進一);

分:9所組成的一進制數(9加一等于9同時向時位進一)。

那麼,當用目前時間(如:2013-11-21 11:18:00)進行初始化後,得到:

年:2013

月:11

日:21

時:15

分:9

即下一次的執行時間是:2013-11-21 15:9:00,如果要獲得再下一次的執行時間就将這個數字系統加一,得到:2013-11-31 5:9:00,但是11月沒有31号,是以該值顯然不合法,那麼繼續加一,得到:2013-11-31 15:9:00,還是不合法,繼續加一,得:2013-12-1 5:9:00,合法。那麼第二次的執行時間點就是2013-12-1 5:9:00。隻要再結合是否需考慮星期就可以完全實作corn的功能了。

整個數字系統及其加法運算實作起來還是很容易的,隻是需要突破我們常見的10進制、2進制所形成的固有概念和思維定式,希望能對大家有所啟發。

JXBiz ORM平台程式設計簡明參考手冊 JXWork任務管理軟體源代碼

繼續閱讀