有时重复任务的持续时间比它的周期长(在我的例子中,这可能一次发生几个小时)。想想一个重复的任务,它需要 7 分钟运行,并且计划每 10 分钟运行一次,但有时连续几个小时每次运行需要 15 分钟。
Timer 和 ScheduledThreadPoolExecutor 类都有一个 scheduleAtFixedRate 方法,通常用于此类功能。但是,两者都具有“落后时努力追赶”的特点。换句话说,如果 Timer 落后于几次执行,它会建立一个工作队列,该队列将连续工作,直到它赶上如果没有任何任务花费超过指定期间。如果上一次运行未完成,我想通过跳过当前执行来避免这种行为。
我有一个解决方案,涉及搞乱池执行器的 afterExecution 方法,重新计算延迟,并用新的延迟重新安排可运行对象,但想知道是否有更简单的方法,或者这个功能是否已经存在于某个公共库中. 我知道以固定延迟而不是固定周期进行调度,但这对我不起作用,因为尝试在固定时间执行任务很重要。有没有比我的 afterExecution 解决方案更简单的选项?