java ScheduledExecutorService



背景:多线程并行处理定时任务为什么使用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。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值