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,schedule,任务,线程,延时,执行,方法 来源: https://www.cnblogs.com/cj8357475/p/16032565.html