14.如何执行周期、重复性任务?

 

 

 

如何执行周期、重复性任务?

 

 

 

 

每隔一段时间执行一次任务,这样的任务叫周期性任务,也叫重复性任务。如果你想执行这样的任务,那么你需要用到scheduledExecutorService接口中的方法。

 

 

现在来依次介绍这两个方法,首先是以固定时间的方式重复执行任务的方法,scheduleAtFixedRate,什么叫周期性任务?开头也说过,就是按照指定时间重复执行任务,什么叫周期?就是经过多长时间执行一次任务,时间有两种,一种是固定时间,还有一种是间隔时间。我们现在介绍的方法采用的是固定时间,就是每次执行任务的频率相同,比如说周期为一秒钟,那就是每经过一秒钟执行一次任务,不管前面任务是否执行完,再来看看它的参数,它有4个参数,第一个参数是任务,只能提交runnable任务,第二个参数是延时时间,开始重复执行任务之前等待的时间。


接下来两个参数是固定时间和时间单位,按照设定的时间开始重复执行任务,方法返回一个
scheduledfuture对象,相对于 runnable任务而言,只是起到一个终止任务的作用。因为runner任务没有执行结果,

 

 

下面动画演示该方法的执行过程,这是一个正在运行的线程池,

 

 

这是我们要执行的周期性任务。任务内容,是输出当前时间,

 

 

 

 

 

将任务提交给线程池,假设延迟时间为一秒钟,固定时间也为一秒钟,线程池开始处理任务,

 

 

 

 

 

任务在等待一秒钟之后开始,每经过一秒钟执行一次,从输出的结果中可以看到5秒内,任务执行了4次,

 

 

 

 

下面编写实例代码,验证我们动画所演示的结果是否正确。 


首先定义一个任务
task,实现runnable接口,任务内容是输出当前时间,我们使当前线程休眠一秒钟,用于模拟任务执行时长,

 

 

接下来执行该任务,首先将任务创建出来,然后创建一个核心线程数为5的调度线程值,接着输出当前时间,这是任务提交前的时间。输出的目的是起到一个参考的作用,看看任务是不是按照指定延迟时间后执行的。再接着调用scheduledAtFixedRate方法,并将任务传递给他,指定延时时间为一秒钟,固定时间也闻一秒钟方法,返回值可接收也可不接收,反正它只是起到一个终止任务的作用。 


这里我们就先接收返回值,
5秒后调用callable方法终止任务,最后调用shoudown方法关闭线程池,

 

 

至此main方法编写完成,整个例子也编写完成。执行程序,观察执行结果。从执行结果来看,程序第一次输出16:08:17,过了一秒后每隔一秒输出一次时间,说明任务的延时时间的确是一秒钟,之后每经过一秒钟重复执行一次,

 

 

接下来看看间隔时间重复执行任务的方法。

SchedulewithFixedDelay。

 

 

参数和返回值和上一个方法完全相同,这里就不再赘述了,着重说一下什么是间隔时间。 


就是每次执行任务的时间间隔相同,

 

 

比如说任务执行时间为两秒钟,间隔时间为一秒钟,那么上一次执行完到下一次执行任务中间间隔的时间是一秒钟,

 

 

接下来动画演示方法执行过程,这是一个正在运行的线程池,

 

 

这是我们要执行的周期性任务。任务执行时间是一秒钟,任务内容是输出当前时间,将任务提交给线程池,

 

 

任务在延时一秒钟之后,

 

 

 

 

 

 

开始以任务与任务之间间隔一秒钟的方式重复执行,从输出的结果中可以看到,5秒内任务执行了2次,

 

 

下面编写示例代码,任务代码无需修改,这些任务的代码还是沿用之前的,只不过需要将scheduledAtFixedRate方法改为SchedulewithFixedDelay方法,至此执行任务的代码改写完成,再来执行程序看看。 

 

 


从执行结果来看,程序输出
16点11分56秒和57秒以及59秒,56秒是提交任务前输出的,57秒是任务延时一秒后的执行时间,59秒是任务的下一次执行时间,因为任务的执行时长是一秒钟,任务与任务之间间隔也是一秒钟,所以两次任务输出的时间相差是两秒钟。

 

 

接下来来看看两个方法的区别,它们的区别在于周期不同,一个是以固定时间为周期,一个是以间隔时间为周期,

 

 

下面使用动画形象的演示它们的区别。最上面的是时间。先来看以固定时间重复执行任务是怎样的,假设任务执行时长为两秒钟,重复执行时间为一秒钟,任务执行下来是这样的。 


可以看到每隔一秒钟执行一次任务,再来看以相同间隔时间重复执行任务是怎样的。任务执行时长同样是两秒钟,重复执行时间为一秒钟任务执行下来是这样的,可以看到任务与任务之间间隔一秒钟,通过动画演示的方式,它们两个的区别就很明显了。

 

 总结

最后总结一下本节内容,本节介绍执行周期性任务的方法,他们的作用及用法,这里就不再赘述了,在实际开发中我经常用他们来执行,日志定期归档任务以及爬虫任务。 

 

 


  

附录:

笔记完整文本:

每隔一段时间执行一次任务,这样的任务叫周期性任务,也叫重复性任务。如果你想执行这样的任务,那么你需要用到scheduledExecutorService接口中的方法。现在来依次介绍这两个方法,首先是以固定时间的方式重复执行任务的方法,scheduleAtFixedRate,什么叫周期性任务?开头也说过,就是按照指定时间重复执行任务,什么叫周期?就是经过多长时间执行一次任务,时间有两种,一种是固定时间,还有一种是间隔时间。我们现在介绍的方法采用的是固定时间,就是每次执行任务的频率相同,比如说周期为一秒钟,那就是每经过一秒钟执行一次任务,不管前面任务是否执行完,再来看看它的参数,它有4个参数,第一个参数是任务,只能提交runnable任务,第二个参数是延时时间,开始重复执行任务之前等待的时间。 接下来两个参数是固定时间和时间单位,按照设定的时间开始重复执行任务,方法返回一个scheduledfuture对象,相对于 runnable任务而言,只是起到一个终止任务的作用。因为runner任务没有执行结果,下面动画演示该方法的执行过程,这是一个正在运行的线程池,这是我们要执行的周期性任务。任务内容,是输出当前时间,将任务提交给线程池,假设延迟时间为一秒钟,固定时间也为一秒钟,线程池开始处理任务,任务在等待一秒钟之后开始,每经过一秒钟执行一次,从输出的结果中可以看到5秒内,任务执行了4次,下面编写实例代码,验证我们动画所演示的结果是否正确。 首先定义一个任务task,实现runnable接口,任务内容是输出当前时间,我们使当前线程休眠一秒钟,用于模拟任务执行时长,接下来执行该任务,首先将任务创建出来,然后串联一个核心线程数为5的调度线程值,接着输出当前时间,这是任务提交前的时间。输出的目的是起到一个参考的作用,看看任务是不是按照指定延迟时间后执行的。再接着就用scheduledAtFixedRate方法,并将任务传递给他,指定延时时间为一秒钟,固定时间也闻一秒钟方法,返回值可接收也可不接收,反正它只是起到一个终止任务的作用。 这里我们就先接收返回值,5秒后调用callable方法终止任务,最后调用shoudown方法关闭线程池,至此main方法编写完成,整个例子也编写完成。执行程序,观察执行结果。从执行结果来看,程序第一次输出16:08:17,过了一秒后每隔一秒输出一次时间,说明任务的延时时间的确是一秒钟,之后每经过一秒钟重复执行一次,接下来看看间隔时间重复执行任务的方法。SchedulewithFixedDelay。参数和返回值和上一个方法完全相同,这里就不再赘述了,着重说一下什么是间隔时间。 就是每次执行任务的时间间隔相同,比如说任务执行时间为两秒钟,间隔时间为一秒钟,那么上一次执行完到下一次执行任务中间间隔的时间是一秒钟,接下来动画演示方法执行过程,这是一个正在运行的线程池,这是我们要执行的周期性任务。任务执行时间是一秒钟,任务内容是输出当前时间,将任务提交给线程池,任务在延时一秒钟之后,开始以任务与任务之间间隔一秒钟的方式重复执行,从输出的结果中可以看到,5秒内任务执行了2次,下面编写示例代码,任务代码无需修改,这些任务的代码还是沿用之前的,只不过需要将scheduledAtFixedRate方法改为SchedulewithFixedDelay方法,至此执行任务的代码改写完成,再来执行程序看看。 从执行结果来看,程序输出16点11分56秒和57秒以及59秒,56秒是提交任务前输出的,57秒是任务延时一秒后的执行时间,59秒是任务的下一次执行时间,因为任务的执行时长是一秒钟,任务与任务之间间隔也是一秒钟,所以两次任务输出的时间相差是两秒钟。接下来来看看两个方法的区别,它们的区别在于周期不同,一个是以固定时间为周期,一个是以间隔时间为周期,下面使用动画形象的演示它们的区别。最上面的是时间。先来看以固定时间重复执行任务是怎样的,假设任务执行时长为两秒钟,重复执行时间为一秒钟,任务执行下来是这样的。 可以看到每隔一秒钟执行一次任务,再来看以相同间隔时间重复执行任务是怎样的。任务执行时长同样是两秒钟,重复执行时间为一秒钟任务执行下来是这样的,可以看到任务与任务之间间隔一秒钟,通过动画演示的方式,它们两个的区别就很明显了。最后总结一下本节内容,本节介绍执行周期性任务的方法,他们的作用及用法,这里就不再赘述了,在实际开发中我经常用他们来执行,日志定期归档任务以及爬虫任务。

 

posted @   小陈子博客  阅读(791)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示