ScheduledThreadPoolExecutor简介

ScheduledThreadPoolExecutor可以用来在给定延时后执行异步任务或者周期性执行任务,相对于任务调度的Timer来说,其功能更加强大,Timer只能使用一个后台线程执行任务,而ScheduledThreadPoolExecutor则可以通过构造函数来指定后台线程的个数。

ScheduledThreadExecutor - 图1
从UML图可以看出,ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,也就是说ScheduledThreadPoolExecutor拥有execute()和submit()提交异步任务的基础功能,关于ThreadPoolExecutor可以看这篇文章。但是,ScheduledThreadPoolExecutor类实现了ScheduledExecutorService,该接口定义了ScheduledThreadPoolExecutor能够延时执行任务和周期执行任务的功能;

主要方法

  1. //达到给定的延时时间后,执行任务。这里传入的是实现Runnable接口的任务,
  2. //因此通过ScheduledFuture.get()获取结果为null
  3. public ScheduledFuture<?> schedule(Runnable command,
  4. long delay, TimeUnit unit);
  5. //达到给定的延时时间后,执行任务。这里传入的是实现Callable接口的任务,
  6. //因此,返回的是任务的最终计算结果
  7. public <V> ScheduledFuture<V> schedule(Callable<V> callable,
  8. long delay, TimeUnit unit);
  9. //是以上一个任务开始的时间计时,period时间过去后,
  10. // 检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行
  11. // 如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行
  12. public ScheduledFuture<?> scheduleAtFixedRate(Runnable command,
  13. long initialDelay,
  14. long period,
  15. TimeUnit unit);
  16. //当达到延时时间initialDelay后,任务开始执行。上一个任务执行结束后到下一次
  17. //任务执行,中间延时时间间隔为delay。以这种方式,周期性执行任务。
  18. public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
  19. long initialDelay,
  20. long delay,
  21. TimeUnit unit);

image.png
在任务周期执行过程中出现了异常,会导致周期任务失败

ScheduledFutureTask 最主要的功能是根据当前任务是否具有周期性,对异步任务进行进一步封装。如果不是周期性任务(调用schedule方法)则直接通过run()执行,若是周期性任务,则需要在每一次执行完后,重设下一次执行的时间,然后将下一次任务继续放入到阻塞队列中。


参考文章:
作者:你听 _ 链接:https://www.jianshu.com/p/502f9952c09b