计划调度定时任务的方法

文档序号:6636121阅读:178来源:国知局
专利名称:计划调度定时任务的方法
技术领域
本发明涉及通讯领域,尤其涉及一种计划调度定时任务的方法。
背景技术
随着信息技术的发展,计划调度任务的需求越来越广泛,如,企业需要计划调度每目的目志或者晚间批处理过程;用户需要根据约定计划调度闹铃时间,等等。
与本发明相关的现有技术一,是基于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日
发明者张磊, 龚华 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1