背景:多线程并行处理定时任务为什么使用ScheduledExecutorService

Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,会导致其他异常自动终止。ScheduleExecutorService则没有。

a.使用方法:

创建线程池一般不允许直接使用Executors,而是通过ThreadPoolExecutor的方式,ScheduledExecutorService使用

 ScheduleExecutorService scheduleExecutorService = Executors.newScheduledThreadPool(number)

b.类结构:

       java ScheduledExecutorService

c.常用方法区别:

  scheduleAtFixedRate:顾名思义,固定频率的执行,即每隔多少时间执行一个任务,不管上一个任务执行完成与否。

  scheduleWithFixedDelay:顾名思义,固定延时的执行,上一个任务完成后延迟多久再执行下一个任务。

  scheduleAtFixedRate(new Task(), 5,10,TimeUnit.SECONDS)首次执行延迟5s,后面每10秒执行一次改任务;

  scheduleWithFixedDelay(new Task(), 5,10,TimeUnit.SECONDS)首次执行延迟5s,后面每次执行完成后,隔10秒再执行一次任务。

eg:曾经做过一个需求,要求整点打印日志

      需求分析1)整点 2)每小时打印一次

      


*补充注意

1)直接使用Executors创建线程池,而不是ThreadPoolExecutor,可能会出现资源耗尽的风险。因为FixedTHreadPool、SingleThreadPool允许的最大队列长度为Integer.MAX_VALUE,可能会挤压大量请求导致OOM。

CachedThreadPool、ScheduledThreadPool允许创建的线程数量为Integer.MAX_VALUE,可能会导致大量的线程,从而导致OOM。




相关文章:

  • 2022-12-23
  • 2021-11-22
  • 2021-06-21
  • 2022-12-23
  • 2023-03-06
  • 2021-04-10
  • 2022-01-30
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-01-20
  • 2021-06-17
  • 2022-02-01
  • 2022-12-23
  • 2022-12-23
  • 2021-05-15
相关资源
相似解决方案