Schedule模式1理解Java并发(6):ScheduledExecutorService刨根问底理解并发并发编程ContentsSchedule模式 ......................................................................................... 1与timer的区别 ....................................................................................... 2除了之外,还有一种ScheduledExecutorService支持按照一定的延迟或者固定的间隔来执行任务。ScheduledExecutorService executorService = Executors .newSingleThreadScheduledExecutor();譬如实现一个定时运行的任务:public class BeeperControl { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void beep() { scheduler.scheduleAtFixedRate(() -> { System.out.println("beep"); }, 3, 2, TimeUnit.SECONDS); } public static void main(String[] args) { BeeperControl ctl = new BeeperControl(); ctl.beep(); }}Schedule模式FixedRate允许按照固定的速率来运行,例如: scheduler.scheduleAtFixedRate(() -> { System.out.println("beep"); }, 3, 2, TimeUnit.SECONDS); // 最开始延迟3秒;之后每2秒一次运行假定开始时间为,那么任务的运行时间为:但是这里存在一个问题,就是如果当任务的执行时间大于的时候,会怎样执行?实际情形就是,如果执行时间超过了那么在运行结束之后,下一个任务会立即执行。而的行为是根据上面的公式创建并提交任务,也就意味着,假 与timer的区别2设是秒钟,而第一次执行花费了秒,那么在这段时间之内不止一个(下一次的)任务被提交,那么后面若干次都会立刻执行,如下所示:start:1599108257 开始时间beep :(5)1599108260 第一次执行,花费5秒beep :(1)1599108265 第二次执行,(以后每次都)花费1秒beep :(1)1599108266 立即执行beep :(1)1599108267 立即执行beep :(1)1599108268 立即执行beep :(1)1599108270 间隔2秒beep :(1)1599108272beep :(1)1599108274beep :(1)1599108276beep :(1)1599108278beep :(1)1599108280虽然我们实际上可以配置线程池,但是根据文档描述,不会出现同时运行多个任务的情况:所以实际上,这个线程池是为了配置多个使用的,也就是说,调用多次scheduler.scheduleAtFixedRate创建了很多任务,那么这些任务是有可能会同时执行的,这个时候,就会利用到线程池了。假设线程池中只有一个线程,那么如果两个任务都需要执行,而这时候第一个任务没有执行完成,是需要等到第一个任务执行完之后才能得到空闲的线程来执行第二个任务的。FixedDelay允许按照固定的间隔来运行,例如: scheduler.scheduleAtFixedRate(() -> { System.out.println("beep"); }, 3, 2, TimeUnit.SECONDS); // 最开始延迟3秒;之后每次在上一次完成之后延迟2秒执行假定开始时间为,第次任务执行时间为,那么任务的开始执行时间为:也就是说这个延迟是算上了程序运行的时间的。与timer的区别会受到系统时钟(改变)的影响只有一个执行线程,对于长时间运行的任务会导致阻塞后续任务中如果抛出异常那么直接就整个都结束了;而中默认处理了异常(会抛出异常的任务),但是其他的任务还可以继续执行。 与timer的区别3