定时器是多线程编程中的一个重要且常用的组件,顾名思义,定时器好比一个闹钟一样,必须得等指定时间到了才会去执行任务。那么我们该如何来实现一个简单的定时器呢
首先我们来认识一下定时器的构成
- 使用一个Task类来描述一段逻辑,也就是要执行的任务,并且记录好这个任务在什么时候来执行。
- 使用一个阻塞优先队列来组织若干个Task,使用优先队列就是为了保证队首的任务就是最早需要被执行的那个任务
- 还需要一个扫描线程,来时刻扫描是否有任务的执行时间到了。如果到了就去执行这个任务。
下面我们来看具体代码
public class ThreadDemo20 {//定时器
static class Task implements Comparable<Task> {
@Override
public int compareTo(Task o) {
return (int) (this.time - o.time);
}
static Runnable command;
private long time;//表示啥时候来执行commad。
public Task(Runnable command,long after){//after表示多少毫秒之后执行,是相对时间
this.command = command;
this.time = System.currentTimeMillis()+after;//也就是说这个任务的执行时间等于执行到这段代码的时间加上我们指定的时间
}
public void run() {//可以借助run方法来描述要执行的具体任务是什么
command.run();
}
//由于优先队列中涉及比较规则&#x