Answers
基本的思路是,每次调度一个任务地时候,计算出下一次需要调度的任务和发生时间,然后一直sleep到这个时间,调度下一个任务,如此往复即可,这样你就不用时时刻刻轮询查看了。
为了找出下一次需要调度的任务,一个简单的方法是用小顶堆,将所有任务以时间为key插入这个堆,堆顶就是下次需要的任务(时间最早)。
每次调度任务时将堆顶的任务弹出,调整堆,完成后堆顶就是下一次需要调度的任务。
需要注意的是,每次弹出堆顶任务并完成调整之后,你还需要继续看堆顶的任务是否也已经到期,因为可能存在多个设定了相同时间的任务。
具体到Java,你可以用PriorityQueue。
永远的HIME
answered 10 years, 4 months ago