如何延边时间?
用科学的方法实现延边时间,你需要一个靠谱的时间片切分算法和一个高效的执行器。 下面正式介绍方法。
第一步:参数配置 主要需要3个参数:任务总数、任务周期和任务延迟。 任务总数指每天要完成多少个任务;任务周期指每个任务要耗时多长时间;任务延迟指在某个时间点以后才开始执行的任务,需要加上该点以后的时间延迟(单位是秒)作为额外成本。 举例说明,如果今天是1月1日,早上9点,你的任务总数是20个,每个任务周期是5分钟,那么第一个任务应该在9点整开始执行,第二个任务应该在9点05分开始执行……以此类推。你的任务总延迟是600秒,即在1月1日10点前执行的每一个任务都增加600秒的延时——也就是说如果到1月1号10点还没有执行完所有的任务,那么就要继续运行,直到1月1号11点(超过11点就重新从9点开始计算)。
第二步:任务调度 使用上面的参数配置后,下一步就是实际执行代码了。在Java中,我们可以使用ForkJoinPool.commonPool()或Executors.newFixedThreadPool(int size)创建一个可线程并行的任务执行器。
然后通过调用schedule(Runnable task,long delay)将需要执行的任务添加进来即可。注意这里的延迟时间是以毫秒为单位,与第一步中的延迟参数对应起来。 当一个任务启动时,它的任务状态会先进入RUNNING状态,此时程序会检查该任务的剩余时间(这里指的是任务周期时间减去已经耗费的时间)是否足够,若不足则直接返回,表示这个任务没有足够的资源可以执行;否则转入下一步。
当所有任务都准备好之后,程序就会按照优先级顺序依次执行,每当完成一个任务的执行都会更新其状态为FINISHED,程序也会自动退出。 为了让程序能够正确地等待某一时刻的到来而不会“卡”住,我们需要借助java.util.concurrent包下的工具类来操作。例如可以使用Timer任务在特定时刻触发下一个任务的开始,或者是使用Condition变量来实现多个任务的同步。
第三步:优化措施 如果你的应用对于实时性要求非常高(例如视频直播),那么以上的方法就可能无法满足你的需求了。解决此问题的一个思路是减少任务数量并通过加锁的方式提高任务调度的并发度。也就是说把一个大任务拆分成若干小任务,同时执行这些小任务。
对于每一个需要加锁保护的场景,都需要考虑可能出现的死锁情况并且提前进行处理。另外也可以使用类似Cocos Creator这样的游戏开发引擎自带的线程池管理器来优化。它们一般会提供低延迟模式来让开发者轻松降低任务的延迟。