使用Java实现定时任务的方法有哪些

  介绍

使用Java实现定时任务的方法有哪些?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1,睡眠

这也是我们最常用的睡眠休眠大法,不只是当作休眠用,我们还可以利用它很轻松的能实现一个简单的定时任务。

实现逻辑:

新开一个线程,添加一个/而死循环,然后在死循环里面添加一个休睡眠逻辑,让程序每隔N秒休眠再执行一次,这样就达到了一个简单定时任务的效果。

实现代码如下:

private  static  void  sleepTask (), {   ,new 线程((),→,{   while 才能;(真实),{   ,,System.out.println(“嗨,,欢迎关注:Java技术栈“);      ,,try  {   ,,,//,每隔3秒执行一次   ,,,thread . sleep (3000);   ,,},catch  (InterruptedException  e), {   ,,,e.printStackTrace ();   ,,}   ,,}   ,}).start ();   }

这种方式比较傻瓜化了,只能按固定频率运行,不能指定具体运行的时间。

另外,上面的箭头语法,栈长使用了JDK 8中的λ表达式,这里就不再撰述了,Java 8系列实战教程我都写了一堆了,不清楚的可以关注公众号:Java技术栈,在后台回复“java"阅读,我都整理好了。

2,计时器

来看下JDK自带的java.util。定时器类:

使用Java实现定时任务的方法有哪些

JDK 1.3就内置了java.util。定时器类,可以用来调度java.util。TimerTask任务。

使用Java实现定时任务的方法有哪些

几个重要的方法:

<李>

时间表:开始调度任务,提供了几个包装方法;

<李>

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

<李>

清洗:从任务队列中移除所有已取消的任务,

另外,java.util。TimerTask就是实现了Runnable接口,具体任务逻辑则是在运行方法里去实现。

使用Java实现定时任务的方法有哪些

实现代码如下:

private  static  void  TimerTask (), throws  InterruptedException  {   ,Timer  Timer =, new 计时器();      ,TimerTask  TimerTask =, new  TimerTask (), {   @Override才能   public 才能;void 运行(),{   ,,System.out.println(“嗨,,欢迎关注:Java技术栈“);   ,,}   ,};      ,//第一次任务延迟时间   ,long  delay =, 2000;      ,//任务执行频率   ,long  period =, 3, *, 1000;      ,//开始调度   ,timer.schedule (timerTask,延迟,,);   ,   ,//指定首次运行时间//,timer.schedule (timerTask, DateUtils.addSeconds (new 日期(),5),,);      ,thread . sleep (20000);      ,//终止并移除任务   ,timer.cancel ();   ,timer.purge ();   }

这种实现方式比较简单,可以指定首次执行的延迟时间,首次执行的具体日期时间,以及执行频率,能满足日常需要。

另外,需要注意的是,计时器是线程安全的,因为背后是单线程在执行所有任务。

计时器也会有一些缺陷:

<李>

计时器是单线程的,假如有任务A, B, C,任务一个如果执行时间比较长,那么就会影响任务B, C的启动和执行时间,如果B, C执行时间也比较长,那就会相互影响;

<李>

计时器不会捕获异常,如果A, B, C任何一个任务在执行过程中发生异常,就会导致计时器整个定时任务停止工作,

<李>

计时器是基于绝对时间调度的,而不是基于相对时间,所以它对系统时间的改变非常敏感;

所以,如果在使用计时器的过程中要注意这些缺陷,虽然可以用,但不推荐。

3, ScheduledExecutorService

因计时器有一些缺陷,所以不太建议使用计时器,推荐使用ScheduledExecutorService:

使用Java实现定时任务的方法有哪些

ScheduledExecutorService即是计时器的替代者,JDK 1.5并发包引入,是基于线程池设计的定时任务类:

java.util.concurrent.Executors。newScheduledThreadPool

使用Java实现定时任务的方法有哪些

使用Java实现定时任务的方法有哪些