七叶笔记 » java编程 » Java Spring分别实现定时任务方法

Java Spring分别实现定时任务方法

java实现定时任务

Jdk自带的库中,有两种方式可以实现定时任务,一种是Timer,另一种是ScheduledThreadPoolExecutor。

Timer+TimerTask

创建一个Timer就创建了一个线程,可以用来调度TimerTask任务

Timer有四个构造方法,可以指定Timer线程的名字以及是否设置为为守护线程。默认名字Timer-编号,默认不是守护线程。

主要有三个比较重要的方法:

cancel():终止任务调度,取消当前调度的所有任务,正在运行的任务不受影响

purge():从任务队列中移除所有已经取消的任务

schedule:开始调度任务,提供了几个重载方法:

schedule(TimerTask task, long delay)延时执行,表示delay毫秒后执行一次task任务

schedule(TimerTask task, Date time)`指定时间执行,到`time`时间的时候执行一次`taskschedule(TimerTask task, long delay, long period)`延时周期执行,经过`delay`毫秒后每`period`毫秒执行一次`taskschedule(TimerTask task, Date firstTime, long period)`指定时间后周期执行,到达指定时间`firstTime`后每`period`毫秒执行一次`task

示例

输出:Thu Jul 07 14:50:02 CST 2022Thu Jul 07 14:50:03 CST 2022Thu Jul 07 14:50:04 CST 2022Thu Jul 07 14:50:05 CST 2022…………

弊端

Timer是单线程的,并且不会抛出异常,一旦定时任务抛出异常,将会导致整个线程停止,即定时任务停止。

ScheduledThreadPoolExecutor

因为Timer的缺陷,所以不建议使用Timer,建议使用ScheduledThreadPoolExecutor。

ScheduledThreadPoolExecutor是Timer的替代者,于JDK1.5引入,继承了ThreadPoolExecutor,是基于线程池设计的定时任务类。

主要的调度方法:

schedule只执行一次调度,(任务,延迟时间,延迟时间单位)

scheduleAtFixedRate按固定的频率调度,如果执行时间过长,下次调度会延迟,(任务,第一次执行的延迟时间,周期,时间单位)

scheduleWithFixedDelay延迟调度,一次任务执行完后加上延迟时间执行下一次任务,(任务,第一次执行的延迟时间,间隔时间,时间单位)

示例

Spring定时任务

Spring定时任务主要靠@Scheduled注解实现,corn,fixedDelay,fixedDelayString,fixedRate,fixedRateString五个参数必须指定其一,传两个或三个都会抛出异常

示例

原理

项目启动ScheduledAnnotationBeanPostProcessor的postProcessAfterInitialization()方法扫描带有@Scheduled注解的方法:

将任务解析并添加到任务队列后,交由ScheduledTaskRegistrar类的scheduleTasks方法添加(注册)定时任务到环境中

到此这篇关于Java Spring分别实现定时任务方法的文章就介绍到这了,更多相关Java 定时任务内容请搜索七叶笔记以前的文章或继续浏览下面的相关文章希望大家以后多多支持七叶笔记!

相关文章