Java中定时任务浅析
创始人
2025-06-01 03:02:03
0

Java中有那些定时任务的实现方式,下面从java原生和spring封装对动态管理定时任务的实现简单的聊一聊,不涉及外部组件的实现方式。

在这里插入图片描述

1、Timer

java.util包下提供了对定时任务的支持,涉及2个类:

  • Timer:定时器类
  • TimerTask:任务抽象类

使用该定时任务我们需要继承TimerTask抽象类,覆盖run方法编写任务执行代码,并利用Timer定时器对TimerTask进行调度。
在这里插入图片描述

Timer提供了多种方法,可分为一次性任务和可重复执行任务。

1.1、一次性任务

一次性任务是指Timer执行一次之后,该任务后续不再执行,包括2个方法:

  • void schedule(TimerTask task, long delay):延迟delay毫秒后执行一次task
  • void schedule(TimerTask task, Date time):在指定时间time执行一次task,如果time过期,将会立即执行

1.2、可重复执行任务

可重复执行任务是指任务允许按照设定的规则重复执行,包括4个方法:

  • void schedule(TimerTask task, long delay, long period):延迟delay毫秒后执行task,之后每隔period毫秒执行一次task
  • void schedule(TimerTask task, Date firstTime, long period):在指定时间time执行一次task,之后每隔period毫秒执行一次task
  • void scheduleAtFixedRate(TimerTask task, long delay, long period):延迟delay毫秒后执行task,之后每隔period毫秒执行一次task
  • void scheduleAtFixedRate(TimerTask task, Date firstTime, long period):在指定时间time执行一次task,之后每隔period毫秒执行一次task

1.3、实例

public class DownloadTimerTask extends TimerTask {@Overridepublic void run() {System.out.println("指定时间的任务操作内容");}
}
public static void main(String[] args) throws ParseException {// Timer执行周期任务基于绝对时间,会受到系统时间的影响Timer timer = new Timer();TimerTask downloadTimerTask = new DownloadTimerTask();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");Date date = simpleDateFormat.parse("2023-03-21 10:16:00");timer.schedule(downloadTimerTask,date);}

在idea中会看到”使用ScheduledExecutorService代替Timer吧 “提示,可见并不推荐使用Timer来实现定时任务。

2、ScheduledExecutorService

java.util.concurrent包下提供了基于线程池设计的定时任务类ScheduledExecutorService,它的每个调度任务都会分配到线程池中的一个线程去执行,并发不受影响,各自执行各自的。
在这里插入图片描述
ScheduledExecutorService提供了3种方法:

  • schedule:只执行一次调度,方法第一个參数是任务实例,第二个參数是延迟时间,第三个是时间单元
  • scheduleAtFixedRate:一开始就计算间隔时间,如果任务超过间隔时间,那么就直接开始下一个任务
  • scheduleWithFixedDelay:任务无论执行多久,都要等待上一轮任务完成之后再间隔指定时间,然后才开始下一个任务

实例:

public static void main(String[] args) {// ScheduledThreadPoolExecutor基于相对时间,不会受到系统时间的影响ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);//ScheduledExecutorService scheduledExecutorServicePool = new ScheduledThreadPoolExecutor(5, r -> new Thread(r, "executor-service-pool-" + r.hashCode()));TimerTask downloadTimerTask = new DownloadTimerTask();// 延迟5min后,运行且仅仅运行一次taskscheduledExecutorService.schedule(downloadTimerTask, 5, TimeUnit.MINUTES);}

3、ThreadPoolExecutor和ScheduledThreadPoolExecutor

jdk原生的两个常用线程池对象:ThreadPoolExecutor、ScheduledThreadPoolExecutor。
ScheduledThreadPoolExecutor继承自ThreadPoolExecutor,主要用来在给定的延迟之后运行任务,或者定期执行任务。ScheduledThreadPoolExecutor的功能与Timer类似,但ScheduledThreadPoolExecutor功能更强大、更灵活。Timer对应的是单个后台线程,而 ScheduledThreadPoolExecutor可以在构造函数中指定多个对应的后台线程数。
在这里插入图片描述
ThreadPoolExecutor构造方法及其作用:
在这里插入图片描述

  • corePoolSize:线程池维护线程的最少数量
  • maximumPoolSize:线程池维护线程的最大数量
  • keepAliveTime: 线程池维护线程所允许的空闲时间
  • unit: 线程池维护线程所允许的空闲时间的单位
  • workQueue: 线程池所使用的缓冲队列
  • handler: 线程池对拒绝任务的处理策略

ScheduledThreadPoolExecutor构造方法及其作用:
在这里插入图片描述
实例见第2小节,ScheduledThreadPoolExecutor是接口ScheduledExecutorService的实现类。

4、ThreadPoolTaskExecutor和ThreadPoolTaskScheduler

springboot自动装配的两个常用线程池对象:ThreadPoolTaskExecutor,ThreadPoolTaskScheduler(参考org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration),分别对应jdk的两个线程池,是静态代理增强,故ThreadPoolTaskScheduler的api是最丰富的。

  • ThreadPoolTaskExecutor:一个专门用于执行任务的类
    在这里插入图片描述

  • ThreadPoolTaskScheduler:一个专门用于调度任务的类
    在这里插入图片描述

ThreadPoolTaskScheduler是spring中提供的线程池任务调度类,能够开启线程池进行任务调度。
ThreadPoolTaskScheduler 提供了4种定时任务方法:

  • schedule(Runnable task, Date stateTime),在指定时间执行一次定时任务
  • schedule(Runnable task, Trigger trigger),动态创建指定表达式cron的定时任务threadPoolTaskScheduler.schedule(() -> {}, triggerContext -> newCronTrigger(“”).nextExecutionTime(triggerContext));
  • scheduleAtFixedRate,指定间隔时间执行一次任务,间隔时间为前一次执行开始到下次任务开始时间
  • scheduleWithFixedDelay,指定间隔时间执行一次任务,间隔时间为前一次任务完成到下一次开始时间

ThreadPoolTaskScheduler.schedule()方法会创建一个定时计划ScheduledFuture,在这个方法需要添加两个参数,Runnable(线程接口类) 和CronTrigger(定时任务触发器),在ScheduledFuture中有一个cancel可以停止定时任务。
实例:

@Configuration
public class ThreadPoolTaskSchedulerConfig {@Beanpublic ThreadPoolTaskScheduler syncScheduler() {ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();threadPoolTaskScheduler.setPoolSize(5);threadPoolTaskScheduler.setRemoveOnCancelPolicy(true);threadPoolTaskScheduler.setThreadNamePrefix("syncThread-");return threadPoolTaskScheduler;}
}
@Slf4j
public abstract class AbstractJob implements Runnable {private ScheduledFuture scheduledFuture;@Autowiredprivate ThreadPoolTaskScheduler threadPoolTaskScheduler;@Overridepublic void run() {begin();execute();end();}/*** 定时任务执行之前*/public void begin() {log.info("------开始执行任务------");}/*** 执行任务*/public abstract void execute();/*** 定时任务执行之后*/public void end() {log.info("------结束执行任务------");}/*** @description: 创建定时任务* @param: cron  时间表达式* @return: void*/public void createJob(String cron) {try {log.info("创建定时任务");scheduledFuture = threadPoolTaskScheduler.schedule(this, new CronTrigger(cron));} catch (Exception e) {log.error("创建定时任务失败!");e.printStackTrace();}}/*** 取消执行任务*/public void cancelJob() {try {if (scheduledFuture != null) {scheduledFuture.cancel(true);}log.info("取消执行任务!");} catch (Exception e) {log.error("取消执行失败 !");e.printStackTrace();}}}

在请求端点的方法中调用创建定时任务方法即可,结果类似如下
在这里插入图片描述

相关内容

热门资讯

现代诗歌金波 现代诗歌金波(精选7首)  在日常生活或是工作学习中,大家一定都接触过一些使用较为普遍的诗歌吧,诗歌...
月亮边的妹妹诗歌 月亮边的妹妹诗歌  遥遥银河边缘  悠悠白云深处  驻守着我的妹妹  美丽善良的妹妹  你是晚霞疲惫...
歌颂劳动者的诗歌朗诵 歌颂劳动者的诗歌朗诵(精选13首)  无论在学习、工作或是生活中,大家都收藏过自己喜欢的诗歌吧,诗歌...
题李凝幽居诗词赏析 题李凝幽居诗词赏析  【诗人简介】  贾岛:(779-843),字阆仙,范阳(今北京)人。早年出家为...
语文诗词的手抄报 关于语文诗词的手抄报  导语:诗词,是指以古体诗、近体诗和格律词为代表的中国古代传统诗歌。亦是汉字文...
对李白《行路难》的赏析 对李白《行路难》的赏析  在日常的学习、工作、生活中,大家都经常接触到诗歌吧,诗歌具有精炼含蓄的特点...
爱情古诗句唯美图片 爱情古诗句唯美图片  不要承诺,不要誓言,只要用一杯茶的温度,品茗一生的幸福。有一种牵挂,在心底反复...
雨霖铃柳永全文及翻译 雨霖铃柳永全文及翻译  《雨霖铃·寒蝉凄切》是宋代词人柳永的词作。此词上片细腻刻画了情人离别的场景,...
林清玄《阳光的味道》全文 林清玄《阳光的味道》全文  林清玄中国著名文化学者,理论家、文化史学家、作家 、散文家。下面是《阳光...
汪藻《春日》原文及译文 汪藻《春日》原文及译文  《春日》是北宋诗人汪藻创作的一首七言律诗。这首诗通过对春日出游的见闻感受的...
于春的诗句 于春的诗句  1) 满目山河空念远,落花风雨更伤春。 ——出处: 晏殊《浣溪沙•一向年光有...
与颜色有关的诗句 与颜色有关的诗句  诗句就是组成的句子。诗句通常按照诗文的格式体例,限定每句字数的多少。以下是小编帮...
梁实秋《雅舍谈吃》散文集:《... 梁实秋《雅舍谈吃》散文集:《满汉细点》  引导语:《雅舍谈吃》是梁实秋先生一生在饮食文化方面才华的集...
浣溪沙姜夔赏析诗词 浣溪沙姜夔赏析诗词  浣溪沙,原为唐教坊曲名,后用为词牌名。此调分平仄两体,字数以四十二字居多,另有...
晨起动征铎,客行悲故乡 “晨起动征铎,客行悲故乡。”出处 出自 唐代 温庭筠 的《商山早行》“晨起动征铎,客行悲故乡。”全诗...
教师节我想对老师说的话   教师节马上就要到了,想好了要怎么祝福老师吗?下面小编就为大家整理了教师节我想对老师说的话,欢迎阅...
好听唯美的诗句诗词 好听唯美的诗句诗词大全  在学习、工作乃至生活中,大家都看到过许多经典的诗句吧,诗句是诗的句子,泛指...
八月中秋诗句有哪些 八月中秋诗句有哪些  在我们平凡的日常里,说到诗句,大家肯定都不陌生吧,诗句一般饱含丰富的'想象、联...
新春的诗句有哪些 新春的诗句有哪些  春节起源于殷商时期年头岁尾的祭神祭祖活动,是中国最盛大、最热闹、最重要的一个古老...
“不知细叶谁裁出,二月春风似... “不知细叶谁裁出,二月春风似剪刀。”出处:唐·贺知章《咏柳》 [意思]不知那丝丝柳叶是谁裁出,原来二...