Java ~ Executor ~ ScheduledExecutorService【总结】

前言


 相关系列

  • 《Java ~ Executor【目录】》(持续更新)
  • 《Java ~ Executor ~ ScheduledExecutorService【源码】》(学习过程/多有漏误/仅作参考/不再更新)
  • 《Java ~ Executor ~ ScheduledExecutorService【总结】》(学习总结/最新最准/持续更新)
  • 《Java ~ Executor ~ ScheduledExecutorService【问题】》(学习解答/持续更新)

 涉及内容

  • 《Java ~ Executor【总结】》
  • 《Java ~ Executor ~ ExecutorService【总结】》

一 概述


 简介

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

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

二 方法


  • public ScheduledFuture schedule(Runnable command, long delay, TimeUnit unit) —— 调度 —— 向当前调度执行器服务递交在指定延迟后执行的可运行/任务,并返回追踪/获取可运行/任务执行状态/结果的调度未来。由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获取可运行/任务的执行结果,故而该方法返回的调度未来的get()方法将永远返回null。

  • public ScheduledFuture schedule(Callable callable, long delay, TimeUnit unit) —— 调度 —— 向当前调度执行器服务递交在指定延迟后执行的可调用/任务,并返回追踪/获取可调用/任务执行状态/结果的调度未来。

  • public ScheduledFuture scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) —— 按固定速率调度 —— 向当前调度执行器服务递交在指定初始延迟后按指定周期周期性执行的可运行/任务,并返回追踪/获取可运行/任务执行状态/结果的调度未来。由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获取可运行/任务的执行结果,故而该方法返回的调度未来的get()方法将永远返回null。但又因为该方法递交的可运行/任务将在自身没有被取消/执行中没有抛出异常/当前调度执行器服务没有被终止的情况下永远周期性地执行下去,因此调度未来的get()方法要么因为上述情况抛出异常,要么因为无法获取到结果而无限等待。此外,即使可运行/任务的执行时间超过周期,下次执行依然会在距离上次执行开始时间点的指定周期后开始,并且上次执行会被取消(虽然可能无法响应)。

  • public ScheduledFuture scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) —— 随固定延迟调度 —— 向当前调度执行器服务递交在指定初始延迟后按指定延迟周期性执行的可运行/任务,并返回追踪/获取可运行/任务执行状态/结果的调度未来。由于在递交可运行/任务时没有传入用于承载可运行/任务执行结果的变量,因此调度未来实际无法获取可运行/任务的执行结果,故而该方法返回的调度未来的get()方法将永远返回null。但又因为该方法递交的可运行/任务将在自身没有被取消/执行中没有抛出异常/当前调度执行器服务没有被终止的情况下永远周期性地执行下去,因此调度未来的get()方法要么因为上述情况抛出异常,要么因为无法获取到结果而无限等待。此外,如果可运行/任务的执行时间超过周期,则下次执行会在距离上次执行结束时间点的指定延迟后开始。

你可能感兴趣的:(Java,#,Executor,java,开发语言,Executor)