点击关注公众号,Java干货及时送达 是的,不用任何框架,用我们朴素的 Java 编程语言就能实现定时任务。 今天,栈长就介绍 3 种实现方法,教你如何使用 JDK 实现定时任务! 1、 sleep这也是我们最常用的 sleep 休眠大法,不只是当作休眠用,我们还可以利用它很轻松的能实现一个简单的定时任务。 实现逻辑: 新开一个线程,添加一个 for/ while 死循环,然后在死循环里面添加一个 sleep 休眠逻辑,让程序每隔 N 秒休眠再执行一次,这样就达到了一个简单定时任务的效果。 实现代码如下:
这种方式比较傻瓜化了,只能按固定频率运行,不能指定具体运行的时间。 另外,上面的箭头语法,栈长使用了 JDK 8 中的 Lambda 表达式,这里就不再撰述了,Java 8 系列实战教程我都写了一堆了,不清楚的可以关注公众号:Java技术栈,在后台回复 "java" 阅读,我都整理好了。 2、Timer来看下 JDK 自带的 java.util.Timer 类: JDK 1.3 就内置了 java.util.Timer 类,可以用来调度 java.util.TimerTask 任务。 几个重要的方法:
另外,java.util.TimerTask 就是实现了 Runnable 接口,具体任务逻辑则是在 run 方法里去实现。 实现代码如下:
这种实现方式比较简单,可以指定首次执行的延迟时间、首次执行的具体日期时间,以及执行频率,能满足日常需要。 另外,需要注意的是,Timer 是线程安全的,因为背后是单线程在执行所有任务。 Timer 也会有一些缺陷:
所以,如果在使用 Timer 的过程中要注意这些缺陷,虽然可以用,但不推荐。 3、ScheduledExecutorService因 Timer 有一些缺陷,所以不太建议使用 Timer,推荐使用 ScheduledExecutorService: ScheduledExecutorService 即是 Timer 的替代者,JDK 1.5 并发包引入,是基于线程池设计的定时任务类:
上了线程池,每个调度任务都会分配到线程池中的某一个线程去执行,任务就是并发调度执行的,任务之间互不影响。 几个重要的调度方法:
另外,可以看出,任务是支持 Runnable 和 Callable 调度的。 实现代码如下:
这是一个按固定频率调度的任务,创建了 10 个核心线程数,首次执行延迟 2 秒,后续每 3 秒执行一次。 这种方式简单、好用,避免了使用 Timer 带来的各种问题,推荐使用这种实现方式。 总结好了,本文栈长分享了 3 种 Java 实现定时任务的方式,也相对简单,但执行频率时间设置都太简单,只适合简单的业务,不适合实际复杂业务的需求,实际业务要考虑分布式、故障转移恢复等远要复杂的多。 本文仅给大家一个参考吧,在不用框架的前提下也能实现定时任务,在小而美的场景,还是很香的。 最后,Java 系列教程还会继续更新,关注Java技术栈公众号第一时间推送,还可以在公众号菜单中获取历史 Java 教程,都是干货。 本节教程所有实战源码已上传到这个仓库:
最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。 版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。 |
|
来自: 昵称10087950 > 《JAVA》