背景:多线程并行处理定时任务为什么使用ScheduledExecutorService
Timer运行多个TimeTask时,只要其中之一没有捕获抛出的异常,会导致其他异常自动终止。ScheduleExecutorService则没有。
a.使用方法:
创建线程池一般不允许直接使用Executors,而是通过ThreadPoolExecutor的方式,ScheduledExecutorService使用
ScheduleExecutorService scheduleExecutorService = Executors.newScheduledThreadPool(number)
b.类结构:
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。