• 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,它的作用及用法,这里就不再赘述了。在实际开发中,我一般用他们来执行需要延时且只执行一次的任务。

     

  • 相关阅读:
    哈尔滨理工大学第六届程序设计团队 H-Permutation
    哈尔滨理工大学第六届程序设计团队 E-Mod
    哈尔滨理工大学第六届程序设计团队 I-Team
    HDU Today
    最短路
    Pseudoforest(伪最大生成树)
    Connect the Cities(prim)用prim都可能超时,交了20几发卡时过的
    Jungle Roads(最小生成树)
    linux读取yaml文件的某个属性值
    dos查看电脑配置
  • 原文地址:https://www.cnblogs.com/cj8357475/p/16032565.html
Copyright © 2020-2023  润新知