13.如何执行定时任务,延时任务

2022/3/28 23:31:56

本文主要是介绍13.如何执行定时任务,延时任务,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

 

 

如何执行定时、延时任务?

 

 

 

如果你想执行定时或延时的任务,那么你需要用到scheduledExecutorService接口中的方法。

 

 

在了解这些方法之前,我得先介绍该接口的实现类,也就是具备执行定时或延时任务的线程池。因为我们之前创建的线程池都没实现过该接口,所以他们不具备执行定时或延迟任务的功能,这个类的名字有点长,叫scheduledthreadPoolExecutor,中文翻译过来就是调度线程池,什么意思?呢就是具备执行定时或延时任务的线程池,它还可以执行周期性任务,这个下一期再讲,

 

 

他继承自threadPoolExecutor类,说明他也能干普通线程池干的事,

 

 

那如何创建它呢?


我们可以通过它自身的构造方法来创建它,

 

 

也可以通过工具类Executors来创建它,

 

 

一共有4个方法,它们的作用我列举出来了

 

 延时执行一次runnable任务的schedule方法

如图所示具体的内容就不一一念了。现在来依次介绍我们开头的两个方法,首先是延时执行一次runnable任务的schedule方法,注意它不是重复执行的,时间到了以后他只执行一次,

 

 

它有三个参数,第一个参数是任务,只能传runnable任务,第二个参数是指定延迟的时间,这个参数要和第三个参数一起看。第三个参数是指定时间单位可以是年月日,也可以是时分秒。方法返回一个scheduledfuture对象,和future一样,用来接收任务执行结果的,由于runnable任务没有执行结果,所以它就只是起到一个取消任务和查看任务进度的作用。

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

 

 

这是我们要延时执行的任务。 

 

 


调用schedule方法提交给线程池,线程池开始处理任务,

 

 

 

 

 

因为是延时任务,所以要等到时间到了以后,

 

 

 

 

 

 

 

 

任务才开始执行,

 

 

任务执行完成以后将结果返回给调用者,调用者拿到结果以后可自行处理。

 

 

下面编写示例代码,首先定义一个任务task,实现runnable接口,任务内容是输出当前时间,待会看看任务前后的时间间隔等不等于延时时间,

 

 

接下来我们来执行该任务,首先将任务创建出来,然后创建一个核心线程数为5的调度线程池,接着在提交任务之前输出一次当前时间。 


再接着就用schedule方法,并将任务传递给他,延时时间指定为三秒钟,最后调用shoudown方法关闭线程池,

 

 

至此main方法编写完成,整个例子也编写完成。

执行程序观察执行结果,从执行结果来看,程序输出1:09:30和1:09:33,它们之间相差正好是三秒钟,说明任务的确是延时三秒后执行的。

 

 延时执行一次callabler任务的schedule方法

接下来来看看延时执行一次callabler任务的schedule方法,和前面的方法除了提交的任务不同以外,其余的都相同,下面我们就不再重复演示执行动画了,直接编写实例代码,重新编写一个有返回值的任务。 


resulttask实现callable接口,任务内容是以字符串形式返回当前时间。所以callable泛型是string,重写call方法,调用local time的now()方法,以字符串的形式返回当前时间。

 

 

至此任务部分编写完成,执行任务的代码还是沿用之前的,只不过需要将task任务改为resulttask任务,接下来接收schedule方法返回值,拿到返回值以后,调用future的get方法输出结果,get方法有异常抛出,使用try---catch将其捕获。另外我们将关闭线程池的操作移到finally代码块中,至此执行任务的代码改写完成

 

 

再来执行程序看看,从执行结果来看,程序输出10:02:38和10:02:41,它们之间相差正好是三秒钟,说明任务的确是延时三秒后执行的。 

 

 总结


最后总结一下本节内容,本节介绍了执行定时延迟任务的方法schedule,它的作用及用法,这里就不再赘述了。在实际开发中,我一般用他们来执行需要延时且只执行一次的任务。 

 

 


  

附录:

笔记完整文本:

如果你想执行定时或延时的任务,那么你需要用到scheduledExecutorService接口中的方法。在了解这些方法之前,我得先介绍该接口的实现类,也就是具备执行定时或延时任务的线程池。因为我们之前创建的线程池都没实现过该接口,所以他们不具备执行定时或延迟任务的功能,这个类的名字有点长,叫scheduledthreadPoolExecutor,中文翻译过来就是调度线程池,什么意思?呢就是具备执行定时或延时任务的线程池,它还可以执行周期性任务,这个下一期再讲,他继承自threadPoolExecutor类,说明他也能干普通线程池干的事,那如何创建它呢? 我们可以通过它自身的构造方法来创建它,也可以通过工具类Executors来创建它,一共有4个方法,它们的作用我列举出来了,如图所示具体的内容就不一一念了。现在来依次介绍我们开头的两个方法,首先是延时执行一次runnable任务的schedule方法,注意它不是重复执行的,时间到了以后他只执行一次,它有三个参数,第一个参数是任务,只能传runnable任务,第二个参数是指定延迟的时间,这个参数要和第三个参数一起看。第三个参数是指定时间单位可以是年月日,也可以是时分秒。方法返回一个scheduledfuture对象,和future一样,用来接收任务执行结果的,由于runnable任务没有执行结果,所以它就只是起到一个取消任务和查看任务进度的作用。下面动画演示schedule方法的执行过程,这是一个正在运行的线程池,这是我们要延时执行的任务。 调用schedule方法提交给线程池,线程池开始处理任务,因为是延时任务,所以要等到时间到了以后,任务才开始执行,任务执行完成以后将结果返回给调用者,调用者拿到结果以后可自行处理。下面编写示例代码,首先定义一个任务task,实现runnable接口,任务内容是输出当前时间,待会看看任务前后的时间间隔等不等于延时时间,接下来我们来执行该任务,首先将任务创建出来,然后创建一个核心线程数为5的调度线程池,接着在提交任务之前输出一次当前时间。 再接着就用schedule方法,并将任务传递给他,延时时间指定为三秒钟,最后调用shoudown方法关闭线程池,至此main方法编写完成,整个例子也编写完成。执行程序观察执行结果,从执行结果来看,程序输出1:09:30和1:09:33,它们之间相差正好是三秒钟,说明任务的确是延时三秒后执行的。接下来来看看延时执行一次callabler任务的schedule方法,和前面的方法除了提交的任务不同以外,其余的都相同,下面我们就不再重复演示执行动画了,直接编写实例代码,重新编写一个有返回值的任务。 resulttask实现callable接口,任务内容是以字符串形式返回当前时间。所以callable泛型是string,重写call方法,调用local time的now()方法,以字符串的形式返回当前时间。至此任务部分编写完成,执行任务的代码还是沿用之前的,只不过需要将task任务改为resulttask任务,接下来接收schedule方法返回值,拿到返回值以后,调用future的get方法输出结果,get方法有异常抛出,使用try---catch将其捕获。另外我们将关闭线程池的操作移到finally代码块中,至此执行任务的代码改写完成,再来执行程序看看,从执行结果来看,程序输出10:02:38和10:02:41,它们之间相差正好是三秒钟,说明任务的确是延时三秒后执行的。 最后总结一下本节内容,本节介绍了执行定时延迟任务的方法schedule,它的作用及用法,这里就不再赘述了。在实际开发中,我一般用他们来执行需要延时且只执行一次的任务。

 



这篇关于13.如何执行定时任务,延时任务的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程