java web开发的一个问题?
悬赏:3 发布时间:2008-07-19 提问人:xey8501 (初级程序员)
java中有没有这种功能,再一定的时间执行某个类?比如,我要在临晨两点执行某个功能.谢谢!
该问题已经关闭: 超过15天由系统自动关闭,悬赏平分给所有参与回答的会员
该问题已经关闭: 超过15天由系统自动关闭,悬赏平分给所有参与回答的会员
回答
引用
在JDK 1.3以后的版本中,Java通过java.util.Timer和java.util.TimerTask这两个类提供了简单的任务调度的功能,我们称之为JDK Timer。
JDK Timer允许按照固定频率重复执行某项任务,这比直接通过编写底层线程程式进行任务调度要轻松许多,但是对于诸如“在每周一10:00执行任务”这种日历相关的任务调度需求来说,JDK Timer就难以应付了。
此外,JDK Timer只适合对执行时间很短的任务进行调度,因为在Timer中任何TimerTask都在同一背景线程中执行,长时间的任务会严重影响到Timer的调度工作。
了解Timer和TimerTask
TimerTask代表一个需要多次执行的任务,他实现了Runnable接口,能够在run()方法中定义任务逻辑。而Timer负责定制调度规则并负责调度TimerTask。
TimerTask
TimerTask相当于Quartz中Job,代表一个被调度的任务。两者最主要区别在于:每当执行任务时,Quartz都会创建一个Job实例,而JDK Timer则使用相同的TimerTask实例。所以假如TimerTask类中拥有状态,则这些状态对于后面的执行是可见的,从这点上来说,TimerTask更象是StatefulJob而非Job。TimerTask实现了Runnable接口,是个抽象类,他只有以下3个方法:
abstract void run():子类覆盖这个方法并定义任务运行的逻辑,每次执行任务时,run()方法被执行一次;
boolean cancel():取消任务。假如任务被安排运行一次且任务未执行时,任务将永远不会运行;假如任务被安排执行多次,调用该方法后,将取消后面的执行安排;
long scheduledExecutionTime():返回此任务最近实际执行的安排执行时间。假如在任务执行过程中调用此方法,则返回值此次执行对应的安排执行时间(一个任务的实现执行时间和安排的计划执行时间并不一致)。该方法一般在run()方法内调用,您能够通过该方法判断本次执行的时间点是否过晚,并据此决定是否要取消本次的运行。该方法一般在固定频率执行时使用才会有意义。
Timer
Timer只能以这样的方式对任务进行调度:在延迟一段时间或在指定时间点后运行一次任务或周期性的运行任务。实际上,Timer内部使用Object#wait(long time)进行任务的时间调度,这种机制不能确保任务的实时执行,只是个粗略的近似值。
每一个Timer对象有一个对应的“背景线程”,他负责调度并执行Timer中任何的TimerTask。由于任何的TimerTask都在这个线程中执行,所以TimerTask的执行时间应该很短,假如一个TimerTask的执行占用了过多的时间,后面的任务就会受到影响。由于后续任务在调度时间轴上受到了“挤压”,可能会造成“扎堆”执行的情况。
JDK Timer允许按照固定频率重复执行某项任务,这比直接通过编写底层线程程式进行任务调度要轻松许多,但是对于诸如“在每周一10:00执行任务”这种日历相关的任务调度需求来说,JDK Timer就难以应付了。
此外,JDK Timer只适合对执行时间很短的任务进行调度,因为在Timer中任何TimerTask都在同一背景线程中执行,长时间的任务会严重影响到Timer的调度工作。
了解Timer和TimerTask
TimerTask代表一个需要多次执行的任务,他实现了Runnable接口,能够在run()方法中定义任务逻辑。而Timer负责定制调度规则并负责调度TimerTask。
TimerTask
TimerTask相当于Quartz中Job,代表一个被调度的任务。两者最主要区别在于:每当执行任务时,Quartz都会创建一个Job实例,而JDK Timer则使用相同的TimerTask实例。所以假如TimerTask类中拥有状态,则这些状态对于后面的执行是可见的,从这点上来说,TimerTask更象是StatefulJob而非Job。TimerTask实现了Runnable接口,是个抽象类,他只有以下3个方法:
abstract void run():子类覆盖这个方法并定义任务运行的逻辑,每次执行任务时,run()方法被执行一次;
boolean cancel():取消任务。假如任务被安排运行一次且任务未执行时,任务将永远不会运行;假如任务被安排执行多次,调用该方法后,将取消后面的执行安排;
long scheduledExecutionTime():返回此任务最近实际执行的安排执行时间。假如在任务执行过程中调用此方法,则返回值此次执行对应的安排执行时间(一个任务的实现执行时间和安排的计划执行时间并不一致)。该方法一般在run()方法内调用,您能够通过该方法判断本次执行的时间点是否过晚,并据此决定是否要取消本次的运行。该方法一般在固定频率执行时使用才会有意义。
Timer
Timer只能以这样的方式对任务进行调度:在延迟一段时间或在指定时间点后运行一次任务或周期性的运行任务。实际上,Timer内部使用Object#wait(long time)进行任务的时间调度,这种机制不能确保任务的实时执行,只是个粗略的近似值。
每一个Timer对象有一个对应的“背景线程”,他负责调度并执行Timer中任何的TimerTask。由于任何的TimerTask都在这个线程中执行,所以TimerTask的执行时间应该很短,假如一个TimerTask的执行占用了过多的时间,后面的任务就会受到影响。由于后续任务在调度时间轴上受到了“挤压”,可能会造成“扎堆”执行的情况。
lighter (高级程序员) 2008-07-19
spring 的quartz有这个功能,具体参看
http://congjl2002.javaeye.com/blog/140871
http://congjl2002.javaeye.com/blog/140871
congjl2002 (资深程序员) 2008-07-21




