zoukankan      html  css  js  c++  java
  • springboot线程池任务调度类 -- ThreadPoolTaskScheduler介绍(还没细看,看不懂)

      springboot中有一个bean,ThreadPoolTaskScheduler,可以很方便的对重复执行的任务进行调度管理;相比于通过java自带的周期性任务线程池ScheduleThreadPoolExecutor,此bean对象支持根据cron表达式创建周期性任务。

    下面介绍一下此bean对象如何实现任务调度,以及如何支持基于cron表达式的任务。

    一、如何实现任务调度?ThreadPoolTaskScheduler其实底层使用也是java自带的线程池,源码分析如下:

    1. 有个成员变量:

    2. 此成员变量的初始化:

    3. 着重注意红色框中的方法,代码如下:

    可以看出,其实也就是初始化了一个指定核心线程数的线程池,任务的调度就是通过此线程池成员变量实现。

    二、如何提交基于cron表达式的任务,以及内部原理。

    1. 提交任务接口如下:

    其中第二个参数Trigger接口有一个实现CronTrigger,CronTrigger的构造函数中:

    传入一个cron表达式string,即可创建一个trigger。

    2. 基于cron表达式的任务调度原理,回到上文提到的接口,源码如下:

    注意红色框中的代码,创建了一个ReschedulingRunnable实例,并调用其中的schedule方法,返回一个Future结果。一起看下ReschedulingRunnable这个类中的schdule方法

    可以看出,首先根据cron表达式计算出下一个执行的delay,然后调用线程池的schedule方法,在指定延迟时间后执行当前这个对象的任务,到了执行时间后,

    会调用实例本身的run方法,看下在run方法中执行了什么:

    在方法第二句中,先执行任务,执行完成后,更新trigger上下文,然后再次调用schedule方法,那么在schedule方法中,又会再次计算下一次的执行时间点,提交下一次的执行任务,如此循环完成任务的调度。

    上面的描述中只是说了大概的原理,其实还有些可以深究的地方,比如super.run()这句,如果方法中抛出了异常会不会导致整个任务的中断,无法执行下一次的任务?源码针对这个问题又是如何规避的呢?

    有兴趣的人可以根据源码找到答案。

  • 相关阅读:
    GoF23:工厂模式(Factory)
    CSS
    HTML
    JSP基础学习
    JSTL标签
    Jsoup
    Centos7下tomcat关闭异常问题
    剑指Offer_#18_删除链表的节点
    剑指Offer_#17_打印从1到最大的n位数
    剑指Offer_#16_数值的整数次方
  • 原文地址:https://www.cnblogs.com/zouhong/p/13081029.html
Copyright © 2011-2022 走看看