• ScheduledThreadPoolExecutor详解与总结


    ScheduledThreadPoolExecutor详解简介

    • 继承自ThreadPooExecutor,为任务提供延迟或周期执行.
    • 使用专门的ScheduledFutureTask来执行周期任务,也可以接收不需要时间调度的任务.
    • 使用DelayedWorkQueue存储任务.(一种无界延迟队列)
    • 支持线程池关闭后可执行,可选择线程池关闭后支持继续执行周期或延迟任务.
    public class ScheduledThreadPoolExecutor 
    extends ThreadPoolExecutor implements 
    ScheduledExecutorService {}

    在源码中可以看到,ScheduledThreadPoolExecutor 的状态管理、入队操作、拒绝操作等都是继承于 ThreadPoolExecutor;ScheduledThreadPoolExecutor 主要是提供了周期任务和延迟任务相关的操作;

    schedule(Runnable command, long delay, TimeUnit unit) // 无返回值的延迟任务
    schedule(Callable callable, long delay, TimeUnit unit) // 有返回值的延迟任务
    scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) // 固定频率周期任务
    scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) // 固定延迟周期任务

    ScheduledThreadPoolExecutor的运行逻辑而言,大致可以表述为:

    首先将 Runnable/Callable 封装为 ScheduledFutureTask,延迟时间作为比较属性;
    然后加入DelayedWorkQueue 队列中,每次取出队首延迟最小的任务,超时等待,然后执行;
    最后判断是否为周期任务,然后重新加入DelayedWorkQueue 队列中;

    其内部结构如图所示:

    这里需要注意的:

    ScheduledThreadPoolExecutor 中的队列不能指定,只能是 DelayedWorkQueue;因为他是 无界队列,所以再添加任务的时候线程最多可以增加到 coreSize,这里不清楚的可以查看 ThreadPoolExecutor 详解,就不再重复了;
    ScheduledThreadPoolExecutor 重写了 ThreadPoolExecutor 的execute() 方法,其执行的核心方法变成 delayedExecute();
    
    

    参考博客:

    https://blog.csdn.net/cristianoxm/article/details/107640772
    https://www.jianshu.com/p/7018d21e4979
    https://blog.csdn.net/weixin_43942106/article/details/112261645

  • 相关阅读:
    部署iis服务器与c#程序遇到的问题小结
    Installing node-oracledb on Microsoft Windows
    Navicat:cant create OCI environment.
    socket.io 中文手册 socket.io 中文文档
    现有的情绪
    Express 4.x Node.js的Web框架
    结构与类的对象在引用上的不同之处
    Android时间戳转换为标准Datetime(yyyy-MM-dd hh:mm:ss)格式
    ASP.NET MVC4中调用WEB API的四个方法
    安恒DASCTF 四月战 WP
  • 原文地址:https://www.cnblogs.com/jelly12345/p/16628088.html
Copyright © 2020-2023  润新知