一、概述
ScheduledExecutorService继承了ExecutorService,主要提供任务延迟和周期执行功能。主要有三种方法:schedule、scheduleAtFixedRate、scheduleWithFixedDelay,用于延迟执行任务,以特定频率周期性执行任务,以特定延迟定期执行任务。schedule:延迟运行一次。 ScheduleAtFixedRate:如果出现超出范围的情况,例如线程,则会以指定的频率定期运行,例如分别为initialDelay、initialDelay+period、或initialDelay+2period。如果执行时间是initialDelay+period,那就太长了。如果超过initialDelay+2period,则下次执行将从initialDelay+3*period开始,不会出现重叠问题。即遵循hack before原则。如果线程池中有多个线程,则每次执行可以发生在不同的线程上。如果定期执行的命令在执行过程中抛出未捕获的异常,则该命令将不再执行。 ScheduleWithFixedDelay 也是如此。 ScheduleWithFixedDelay:每次运行都由延迟分隔。它与时间无关地运行,即第一次初始延迟延迟执行一次,执行后等待延迟时间,第二次运行,依此类推。 2. 为什么定时任务停止运行?
当方法scheduleAtFixedRate和scheduleWithFixedDelay正在运行周期性Runnable任务时,如果Runnable任务的run方法本身抛出未捕获的异常,则scheduleAtFixedRate和scheduleWithFixedDelay将不会继续定期执行任务。即任务执行停止。实现原理如下。 1、ScheduledThreadPoolExecutor定义了一个内部类ScheduledFutureTask,继承自FutureTask,用于封装任务并提供周期性执行的功能。
2。 ScheduledFutureTask的run方法实现如下。周期性任务主要通过runAndReset 方法运行,如果该方法返回false,则调用setNextRunTime 设置下次运行时间。重复任务将停止运行,因为不再调用它来设置下次运行时间。
3。实现runAndReset:如果任务运行成功,run将为true,state的值仍然是NEW,因此该方法的返回值为true。但是,如果在执行过程中发生异常,即调用c.call() 时,ran 会设置为false,并由catch 块中的setExeception 处理。在setException中,状态更新为EXCEPTIONAL,同时启动了一个等待任务结果的线程,最后的run s==NEW变成了false,根据上面的run分析,runAndReset方法返回了false。可以看到重复任务不再运行了。
4.setException方法的定义如下:更新状态为EXCEPTIONAL,通知阻塞等待任务执行结果的线程发生了异常,同时调用finishCompletion唤醒等待的线程。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。