1、基于优先级队列/堆
队列是先进先出,优先级队列是优先级越高就存放在队列之前,我们可以将过期时间越早设置为优先级越高,那么临近过期时间的任务就会在队列前面,距离过期时间越晚的任务就在队列后面。
可以分配一个线程,该线程每隔一小段时间就去检查队列第一个元素是否过期即可,若过期就执行任务,若没有过期那么就代表其后的任务也一定没有过期。剩余的时间这个线程就处于休眠状态,时间间隔到了就唤醒线程。
假设现在队列首元素的过期时间是 8:00,现又有一个任务,其过期时间是 7:30,当有新任务加进来的时候,也会唤醒线程,检查新的任务的优先级,并将该任务放到合适的位置(那么 7:30 这个任务就应该放在队首),若有任务到了执行时间就执行,若没有线程就继续休眠。
2、基于时间轮
时间轮就是将一个轮盘每隔一个间隔就划分为一个区域,这个间隔代表了一段时间,并给每个区域编号。如下图所示:
上面的轮盘中,每一格代表 100ms,每一个格子后都是一个任务链表,任务进来后,会根据其执行时间放入对应的位置,如执行时间为 500ms 后的任务就会放在编号为5的格子后面,执行时间为1500之后的任务就会放在编号为1的格子后面。
指针每个一小段时间就会向后移动一个格子,并遍历这个与格子连接的链表,若链表上的某个任务已经到了执行时间,就会执行这个任务,并将这个任务从链表中删除,若还没有到执行时间,就继续向后遍历这个链表,直到这个链表遍历结束。