title: “时间轮-实现篇”
linkTitle: “时间轮-实现篇”
date: 2022-05-07
weight: 202205070905
在前面的文章《时间轮-理论篇》讲了时间轮的一些理论知识,然后根据理论知识。我们自己来实现一个简单的时间轮。
1. 理论抽象
将时间轮的理论进行抽象,主要有两个方面:
- 时间轮的转动
- 每一个时间间隔任务的处理,从时间间隔的Buket中取出要执行的任务,删除已经关闭的任务。将任务提交给线程池进行执行处理
2.Java实现
接口:
public interface Timer {
void createTimerTask(TimerTask task, long delay, TimeUnit unit);
}
public interface TimerTask {
void run();
}
实现类:
public class TimeWheel implements Timer {
private ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private BlockingQueue<TimerTaskWrapper> addQueue = new ArrayBlockingQueue<>(128);
//每一个tick时间间隔默认1毫秒
private final long duration;
//时间轮启动时间
private volatile long startTime;
private Thread timeWheelThread;
private CountDownLatch startLatch = new CountDownLatch(1);
//时间轮的tick数量
private int tickNum = 128;
private Bucket[] buckets;
private boolean started = false;
public TimeWheel(long duration, TimeUnit unit) {
long nanos = unit.toNanos(duration);
if (TimeUnit.MILLISECONDS.toNanos(1) > nanos) {
this.duration = 1;
} else {
this.duration = unit.toMillis(duration);
}
this.timeWheelThread = new Thread(n