Java Executor ScheduledExecutorService 源码

前言


 相关系列

  • 《Java & Executor & 目录》
  • 《Java & Executor & ScheduledExecutorService & 源码》
  • 《Java & Executor & ScheduledExecutorService & 总结》
  • 《Java & Executor & ScheduledExecutorService & 问题》
     

 涉及内容

  • 《Java & Executor & 总结》
  • 《Java & Executor & ExecutorService & 总结》
     
     

概述


 简介

在这里插入图片描述

    ScheduledExecutorService @ 调度执行器服务接口定义了“调度”概念。调度执行器服务接口是在ExecutorService @ 执行器服务接口的子接口,其在原本的基础上再度新增了“调度”概念。所谓调度可以理解为定时执行,即令任务在指定时间点被执行,而非在可执行时立即执行。

    调度执行器服务接口将“调度”概念细分为“延迟/周期”。“延迟”概念顾名思义,即任务会在其可执行的时间点上延迟指定时间后执行。这种延迟是人为规定的,与任务的执行机制无关。而大部分执行器由于自身任务执行机制的原因虽然也可能造成延迟,但这种延迟并非人为规定,因此与“延迟”概念没有关系。由此可知虽然调度执行器服务接口支持指定任务的延迟时间,但在任务具体执行时其实际延迟时间可能比指定延迟时间更长/短。此外调度执行器服务接口支持零/负延迟,当延迟时间被指定为零/负值时任务会被立即执行。关于“周期”的概念很也好理解,即令任务周期性地重复执行。通过对这两种概念进行组合,调度执行器服务接口可实现无延迟单次执行/有延迟单次执行/无延迟周期执行/有延迟周期执行四种任务调度形式。
 
 

源码


/*
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

/*
 *
 *
 *
 *
 *
 * Written by Doug Lea with assistance from members of JCP JSR-166
 * Expert Group and released to the public domain, as explained at
 * http://creativecommons.org/publicdomain/zero/1.0/
 */

package juc;

import java.util.Date;

/**
 * An {@link ExecutorService} that can schedule commands to run after a given delay, or to execute periodically.
 * 一个可以调度命令在指定延迟后运行,或周期性执行的执行器服务。
 * <p>
 * The {@code schedule} methods create tasks with various delays and return a task object that can be used to cancel or
 * check execution. The {@code scheduleAtFixedRate} and {@code scheduleWithFixedDelay} methods create and execute
 * tasks that run periodically until cancelled.
 * schedule()方法随着可变的延迟创建任务并返回一个可用于取消和检查执行的任务对象。scheduleAtFixedRate()和
 * scheduleWithFixedDelay()方法会周期性地创建及执行任务直至取消。
 * <p>
 * Commands submitted using the {@link Executor#execute(Runnable)} and {@link ExecutorService} {@code submit} methods
 * are scheduled with a requested delay of zero. Zero and negative delays (but not periods) are also allowed in
 * {@code schedule} methods, and are treated as requests for immediate execution.
 * 使用execute和submit方法递交的命令随着0延迟请求调度。0和负延迟(但不可以是周期)在调度方法中也允许,并且被作为
 * 立即执行请求对待。
 * <p>
 * All {@code schedule} methods accept <em>relative</em> delays and periods as arguments, not absolute times or dates.
 * It is a simple matter to transform an absolute time represented as a {@link Date} to the required form. For example, to
 * schedule at a certain future {@code date}, you can use:
 * {@code schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)}.
 * Beware however that expiration of a relative delay need not coincide with the current {@code Date} at which the task
 * is enabled due to network time synchronization protocols, clock drift, or other factors.
 * 所有调度方法都接受相关联的延迟和周期作为参数【即存在针对各种时间格式的重载方法】,不单纯是时间或日期。这是个
 * 转变单纯时间作为日期用于需要格式的简单问题。例如,为了在某个未来时间调度,你可以使用:
 * schedule(task, date.getTime() - System.currentTimeMillis(), TimeUnit.MILLISECONDS)
 * 此外注意:由于网络时间同步规约,时钟漂移,或者其它因素,相对延迟的到期日期不必与启用任务的当前日期一致【即实际
 * 执行时间可能与计划执行时间存在误差...妈的说的这么晦涩是想难到谁?】。
 * <p>
 * The {@link Executors} class provides convenient factory methods for the ScheduledExecutorService implementations
 * provided in this package.
 * Executors类提供便利的调度执行器服务实现(在当前包中实现)的工厂方法。
 * <h3>Usage Example</h3>
 * 使用模板
 * <p>
 * Here is a class with a method that sets up a ScheduledExecutorService to beep every ten seconds for an hour:
 * 这是一个随着方法建立一个调度线程池执行器来在一小时内每十秒鸣响的类:
 * <pre> {@code
 * import static TimeUnit.*;
 * class BeeperControl {
 *   // 通过工厂方法快速创建一个调度线程池执行器。
 *   private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 *
 *   public void beepForAnHour() {
 *     final Runnable beeper = new Runnable() {
 *       public void run() {
 *         System.out.println("beep");
 *       }
 *     };
 *
 *     final ScheduledFuture<?> beeperHandle = scheduler.scheduleAtFixedRate(beeper, 10, 10, SECONDS);
 *     scheduler.schedule(new Runnable() {
 *       public void run() {
 *         beeperHandle.cancel(true);
 *       }
 *     }, 60 * 60, SECONDS);
 *   }
 * }}</pre>
 *
 * @author Doug Lea
 * @since 1.5
 */
public interface ScheduledExecutorService extends ExecutorService {

    /**
     * Creates and executes a one-shot action that becomes enabled after the given delay.
     * 创建和执行一个单在指定延迟之后可用的单次活动。
     *
     * @param command the task to execute 用于执行的任务
     * @param delay   the time from now to delay execution 用于延迟执行的基于当前的时间
     * @param unit    the time unit of the delay parameter 延迟参数的时间单位
     * @return a ScheduledFuture representing pending completion of the task and whose {@code get()} method will return
     * {@code null} upon completion
     * 一个调度未来代表任务的待定完成并且get()方法在完成后将返回null
     * @throws RejectedExecutionException if the task cannot be scheduled for execution
     *                                    拒绝执行异常:如果任务无法被调度执行
     * @throws NullPointerException       if command is null
     *                                    空指针异常:如果命令为null
     * @Description: ------------------------------------------------------------- 名称 -------------------------------------------------------------
     * 调度
     * @Description: ------------------------------------------------------------- 作用 -------------------------------------------------------------
     * 向当前调度执行器服务递交在指定延迟后执行的可运行/任务,并返回追踪/获取可运行/任务执行状态/结果的调度未来。
     * 由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获取可运行/任务的执
     * 行结果,故而该方法返回的调度未来的get()方法将永远返回null。
     * @Description: ------------------------------------------------------------- 逻辑 -------------------------------------------------------------
     * ----
     */
    public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit);

    /**
     * Creates and executes a ScheduledFuture that becomes enabled after the given delay.
     * 创建和执行一个在指定延迟后可用的调度未来。
     *
     * @param callable the function to execute 用于指定的功能
     * @param delay    the time from now to delay execution 用于延迟执行的基于当前时间的时间
     * @param unit     the time unit of the delay parameter 延迟参数的时间单位
     * @param <V>      the type of the callable's result 可调用结果的类型
     * @return a ScheduledFuture that can be used to extract result or cancel
     * 一个可用于提取结果或取消的调度未来
     * @throws RejectedExecutionException if the task cannot be scheduled for execution
     *                                    拒绝执行异常:如果任务无法被调度执行
     * @throws NullPointerException       if command is null
     *                                    空指针异常:如果命令为null
     * @Description: ------------------------------------------------------------- 名称 -------------------------------------------------------------
     * 调度
     * @Description: ------------------------------------------------------------- 作用 -------------------------------------------------------------
     * 向当前调度执行器服务递交在指定延迟后执行的可调用/任务,并返回追踪/获取可调用/任务执行状态/结果的调度未来。
     * @Description: ------------------------------------------------------------- 逻辑 -------------------------------------------------------------
     * ----
     */
    public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit);

    /**
     * Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with
     * the given period; that is executions will commence after {@code initialDelay} then {@code initialDelay+period}, then
     * {@code initialDelay + 2 * period}, and so on. If any execution of the task encounters an exception, subsequent
     * executions are suppressed. Otherwise, the task will only terminate via cancellation or termination of the executor.  If
     * any execution of this task takes longer than its period, then subsequent executions may start late, but will not
     * concurrently execute.
     * 创建和执行一个在指定初始延迟之后,并随着指定周期可用的周期性活动;该执行将在初始延迟之后的initialDelay+period
     * 时间,initialDelay + 2 * period时间开始,等等。如果任意【一次】任务的执行遭遇异常,随后执行将被禁止。此外,任务
     * 将只能通过取消或执行器的终止而终止。如果任意当前任务的执行占有比它的周期更长的时间,那么随后执行可能开始的较
     * 晚,但不会并发地执行【一个任务一个时间只能被一条线程执行】。
     *
     * @param command      the task to execute 用于执行的任务
     * @param initialDelay the time to delay first execution 用于延迟首次执行的时间
     * @param period       the period between successive executions 介于两次连续执行的周期
     * @param unit         the time unit of the initialDelay and period parameters 初始延迟和周期参数的时间单位
     * @return a ScheduledFuture representing pending completion of the task, and whose {@code get()} method will throw an
     * exception upon cancellation
     * 一个调度未来代表任务的等待执行,并且get()方法将在取消后抛出异常。
     * @throws RejectedExecutionException if the task cannot be scheduled for execution
     *                                    拒绝执行异常:如果任务无法被调度执行
     * @throws NullPointerException       if command is null
     *                                    空指针异常:如果命令为null
     * @throws IllegalArgumentException   if period less than or equal to zero
     *                                    非法参数异常:如果周期小于等于0
     * @Description: ------------------------------------------------------------- 名称 -------------------------------------------------------------
     * 按固定速率调度
     * @Description: ------------------------------------------------------------- 作用 -------------------------------------------------------------
     * 向当前调度执行器服务递交在指定初始延迟后按指定周期周期性执行的可运行/任务,并返回追踪/获取可运行/任务执行状
     * 态/结果的调度未来。由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获
     * 取可运行/任务的执行结果,故而该方法返回的调度未来的get()方法将永远返回null。但又因为该方法递交的可运行/任务将
     * 在自身没有被取消/执行中没有抛出异常/当前调度执行器服务没有被终止的情况下永远周期性地执行下去,因此调度未来
     * 的get()方法要么因为上述情况抛出异常,要么因为无法获取到结果而无限等待。此外,即使可运行/任务的执行时间超过周
     * 期,下次执行依然会在距离上次执行开始时间点的指定周期后开始,并且上次执行会被取消(虽然可能无法响应)。
     * @Description: ------------------------------------------------------------- 逻辑 -------------------------------------------------------------
     * ----
     */
    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit);

    /**
     * Creates and executes a periodic action that becomes enabled first after the given initial delay, and subsequently with
     * the given delay between the termination of one execution and the commencement of the next.  If any execution of the
     * task encounters an exception, subsequent executions are suppressed. Otherwise, the task will only terminate via
     * cancellation or termination of the executor.
     * 创建并执行一个在指定初始延迟之后可用,并随着指定介于首次执行结束和下次执行开始的延迟执行的周期型活动。如果
     * 任意【一次】任务的执行遭遇一场,随后执行将被禁止。此外,任务将只能通过取消或执行器的终止而终止。
     *
     * @param command      the task to execute 用于执行的任务
     * @param initialDelay the time to delay first execution 用于延迟首次执行的时间
     * @param delay        the delay between the termination of one execution and the commencement of the next
     *                     介于首次执行终止何下次执行开始的延迟
     * @param unit         the time unit of the initialDelay and period parameters 初始延迟和周期参数的时间单位
     * @return a ScheduledFuture representing pending completion of the task, and whose {@code get()} method will throw an
     * exception upon cancellation
     * 一个调度未来代表任务的等待执行,并且get()方法将在取消后抛出异常。
     * @throws RejectedExecutionException if the task cannot be scheduled for execution
     *                                    拒绝执行异常:如果任务无法被调度执行
     * @throws NullPointerException       if command is null
     *                                    空指针异常:如果命令为null
     * @throws IllegalArgumentException   if period less than or equal to zero
     *                                    非法参数异常:如果周期小于等于0
     * @Description: ------------------------------------------------------------- 名称 -------------------------------------------------------------
     * 随固定延迟调度
     * @Description: ------------------------------------------------------------- 作用 -------------------------------------------------------------
     * 向当前调度执行器服务递交在指定初始延迟后按指定延迟周期性执行的可运行/任务,并返回追踪/获取可运行/任务执行状
     * 态/结果的调度未来。由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获
     * 取可运行/任务的执行结果,故而该方法返回的调度未来的get()方法将永远返回null。但又因为该方法递交的可运行/任务将
     * 在自身没有被取消/执行中没有抛出异常/当前调度执行器服务没有被终止的情况下永远周期性地执行下去,因此调度未来
     * 的get()方法要么因为上述情况抛出异常,要么因为无法获取到结果而无限等待。此外,如果可运行/任务的执行时间超过周
     * 期,则下次执行会在距离上次执行结束时间点的指定延迟后开始。
     * @Description: ------------------------------------------------------------- 逻辑 -------------------------------------------------------------
     * ----
     */
    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit);

}

















本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/905429.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++:继承~派生类以及衍生的多继承与菱形继承问题

C中的继承其实是一个C中的坑,主要体现在其多继承(菱形继承)方面,我们先来了解下继承的概念 一,继承的概念与定义 1.1继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许我们在保持原有类特性的基础上进行扩展&#xff0c;增…

Python 从入门到实战43(Pandas数据结构)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们学习了NumPy数组操作的相关基础知识。今天学习一下pa…

工程项目智能化管理平台,SpringBoot框架智慧工地源码,实现工程建设施工可视化、智能化的全过程闭环管理。

智慧工地管理系统的建设以“1个可扩展性平台2个应用端3方数据融合N个智能设备”为原则。以“智、保、安、全”为导向&#xff0c;与工程建设管理信息系统、综合安防平台深度集成&#xff0c;构建统一的标准化工地平台&#xff0c;实现现场人员、车辆、项目、安全、进度等方面的…

使用React构建现代Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用React构建现代Web应用 1 引言 2 React简介 3 安装React 4 创建React项目 5 设计应用结构 6 创建组件 7 使用组件…

哈希——哈希表处理哈希冲突的方法

处理哈希冲突 实践中哈希表⼀般还是选择除法散列法作为哈希函数。 当然哈希表无论选择什么哈希函数也避免不了冲突&#xff08;主要作用就是减少冲突&#xff09;&#xff0c;那么插入数据时&#xff0c;如何解决冲突呢&#xff1f;主要有两种两种方法&#xff0c;开放定址法和…

海外云手机是什么?对外贸电商有什么帮助?

在外贸电商领域&#xff0c;流量引流已成为卖家们关注的核心问题。越来越多的卖家开始利用海外云手机&#xff0c;通过TikTok等社交平台吸引流量&#xff0c;以推动商品在海外市场的销售。那么&#xff0c;海外云手机到底是什么&#xff1f;它又能为外贸电商卖家提供哪些支持呢…

Hadoop-001-本地虚拟机环境搭建

一、安装VMware 官方下载VMware&#xff1a; https://vmware.mdsoft.top/?bd_vid5754305114651491003 二、下载镜像文件 阿里云镜像仓库&#xff1a; https://mirrors.aliyun.com/centos/ 本文档使用 CentOS-7-x86_64-DVD-1810-7.6.iso 搭建虚拟机 三、搭建虚拟机 1、编辑…

Oracle视频基础1.1.2练习

1.1.2 需求&#xff1a; 查询oracle组件和粒度大小&#xff0c; select component,granule_size from v$sga_dynamic_components;Oracle SGA 中组件和粒度大小查询详解 在 Oracle 数据库的内存结构中&#xff0c;SGA&#xff08;System Global Area&#xff0c;系统全局区&am…

动态上下文信念(DCB)

DCB&#xff08;动态上下文信念&#xff09;是一个用于累积通过注视获得信息的状态表示组件。它由三个部分组成&#xff1a; Fovea&#xff08;中央凹&#xff09;&#xff1a;接收来自注视位置周围区域的高分辨率视觉输入。Contextual beliefs&#xff08;上下文信念&#xf…

双月生日会:温暖相聚,共庆美好时刻

亲爱的华清远见西安中心的家人们&#xff1a; &#x1f389;&#x1f382; 在这金风送爽的秋日里&#xff0c;我们迎来了9、10月的生日会。在这个特别的日子里&#xff0c;我们聚集一堂&#xff0c;共同庆祝那些在这两个月份里出生的小伙伴们的生日。&#x1f382; 活动现场布…

Junit + Mockito保姆级集成测试实践

一、做好单测&#xff0c;慢即是快 对于单元测试的看法&#xff0c;业界同仁理解多有不同&#xff0c;尤其是在业务变化快速的互联网行业&#xff0c;通常的问题主要有&#xff0c;必须要做吗&#xff1f;做到多少合适&#xff1f;现在没做不也挺好的吗&#xff1f;甚至一些大…

【经典论文阅读11】ESMM模型——基于贝叶斯公式的CVR预估

传统的CVR模型&#xff08;也就是直接对conversion rate建模的模型&#xff09;在实际应用中面临两个问题&#xff08;样本选择偏差与数据稀疏性问题&#xff09;。为了解决这两个问题&#xff0c;本文提出ESMM模型。该模型巧妙地利用用户行为序列去建模这个问题&#xff0c;从…

使用Git进行版本控制的最佳实践

文章目录 Git简介基本概念仓库&#xff08;Repository&#xff09;提交&#xff08;Commit&#xff09;分支&#xff08;Branching&#xff09; 常用命令初始化仓库添加文件提交修改查看状态克隆仓库分支操作合并分支推送更改 最佳实践使用有意义的提交信息定期推送至远程仓库使…

Vision-Language Models for Vision Tasks: A Survey阅读笔记

虽然LLM的文章还没都看完&#xff0c;但是终究是开始看起来了VLM&#xff0c;首当其冲&#xff0c;当然是做一片文献综述啦。这篇文章比较早了&#xff0c;2024年2月份出的last version。 文章链接&#xff1a;https://arxiv.org/abs/2304.00685 GitHub链接&#xff1a;GitHu…

Oracle OCP认证考试考点详解082系列07

题记&#xff1a; 本系列主要讲解Oracle OCP认证考试考点&#xff08;题目&#xff09;&#xff0c;适用于19C/21C,跟着学OCP考试必过。 31. 第31题&#xff1a; 题目 解析及答案&#xff1a; 关于 “SET VERIFY ON” 命令&#xff0c;以下哪两个陈述是正确的&#xff1f; A…

网络搜索引擎Shodan(7)完结

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 声明&#xff1a;本文主要用作技术分享&#xff0c;所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判断风险&#xff0c;并遵循相关法律法规。 感谢泷…

【C++ 算法进阶】算法提升八

复杂计算 &#xff08;括号问题相关递归套路 重要&#xff09; 题目 给定一个字符串str str表示一个公式 公式里面可能有整数 - * / 符号以及左右括号 返回最终计算的结果 题目分析 本题的难点主要在于可能会有很多的括号 而我们直接模拟现实中的算法的话code会难写 要考虑…

​IOT NTN 与 NR NTN​

NTN&#xff08;Non-Terrestrial Network)&#xff09;&#xff0c;即非地面网络通信&#xff0c;通过不同轨道高度的卫星对地面上的终端提供网络连接的服务。利用卫星通信网络与地面蜂窝网络的融合&#xff0c;可以在不受地形地貌的限制和影响下&#xff0c;连通空、天、地、海…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中&#xff0c;已经识别到了camera sensor ID&#xff0c;并且可以拿到raw图和isp处理后的图像&#xff0c;但是isp处理后的图像偏绿&#xff0c;来看查看后台服务发现rkaiq_3A_server没有运行&#xff0c;然后单独运行rkaiq_3A_s…

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper+代码——交叉注意力(Cross-Attention)

【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力&#xff08;Cross-Attention&#xff09; 【深度学习中的注意力机制10】11种主流注意力机制112个创新研究paper代码——交叉注意力&#xff08;Cross-Attention&#xff09; 文章目录 【…