HashedWheelTimer

Netty工具类HashedWheelTimer源码走读(三)

两盒软妹~` 提交于 2019-11-30 12:05:43
接上一篇( http://my.oschina.net/haogrgr/blog/490266 ) 8. Worker代码走读. //主要负责累加tick, 执行到期任务等. private final class Worker implements Runnable { private final Set<Timeout> unprocessedTimeouts = new HashSet<Timeout>(); private long tick; @Override public void run() { //初始化startTime, startTime只是一个起始时间的标记, 任务的deadline是相对这个时间点来的. startTime = System.nanoTime(); //因为nanoTime返回值可能为0, 甚至负数, 所以这时赋值为1, Timer中start方法会判断该值, 直到不为0才跳出循环. if (startTime == 0) { startTime = 1; } //唤醒阻塞在Timer.start()方法上的线程, 表示已经启动完成. startTimeInitialized.countDown(); //只要还是启动状态, 就一直循环 do { //waitForNextTick方法主要是计算下次tick的时间,

Netty工具类HashedWheelTimer源码走读(二)

只愿长相守 提交于 2019-11-30 12:05:30
接上一篇( http://my.oschina.net/haogrgr/blog/489320 ) 6. HashedWheelTimeout源码走读. //任务的包装类, 链表结构, 负责保存deadline, 轮数, 等 //继承MpscLinkedQueueNode, 是因为timeous队列是MpscLinkedQueue, 里面对MpscLinkedQueueNode有特殊处理(并发优化) private static final class HashedWheelTimeout extends MpscLinkedQueueNode<Timeout> implements Timeout { private static final int ST_INIT = 0; private static final int ST_CANCELLED = 1; private static final int ST_EXPIRED = 2; private static final AtomicIntegerFieldUpdater<HashedWheelTimeout> STATE_UPDATER; static { AtomicIntegerFieldUpdater<HashedWheelTimeout> updater = PlatformDependent

Netty HashedWheelTimer 定时任务调用

感情迁移 提交于 2019-11-29 09:49:41
一个Hash Wheel Timer是一个环形结构,可以想象成时钟,分为很多格子,一个格子代表一段时间(越短Timer精度越高),并用一个List保存在该格子上到期的所有任务,同时一个指针随着时间流逝一格一格转动,并执行对应List中所有到期的任务。 这个类一般用来处理大量的定时任务且任务对时间精度要求相对不高, 比如链接超时管理等场景, 缺点是, 内存占用相对较高.该类中有两个重要的参数 Tick Duration:即一个格子代表的时间,默认为100ms,因为IO事件不需要那么精确; Ticks per Wheel (Wheel Size):一个Wheel含有多少个格子,默认为512个,如果任务较多可以增大这个参数. public class HashedWhellTimerTest { static Timer timer = new HashedWheelTimer(50L,TimeUnit.MILLISECONDS,512); public static void main(String[] args) { TimerTask task = new TimerTask() { @Override public void run(Timeout timeout) throws Exception { System.out.println("---run service----

Netty工具类HashedWheelTimer源码走读(一)

橙三吉。 提交于 2019-11-29 09:48:23
1. 简单介绍. A Timer optimized for approximated I/O timeout scheduling. 关于Timer的介绍可以看看这篇文章, 写得不错 : http://novoland.github.io/%E5%B9%B6%E5%8F%91/2014/07/26/%E5%AE%9A%E6%97%B6%E5%99%A8%EF%BC%88Timer%EF%BC%89%E7%9A%84%E5%AE%9E%E7%8E%B0.html 可以看到, HashedWheelTimer 主要用来高效处理大量定时任务, 且任务对时间精度要求相对不高, 比如链接超时管理等场景, 缺点是, 内存占用相对较高. 2. 简单例子. 1) 引入最新的Netty 5依赖 (不一定需要Netty5以前的版本里HashedWheelTimer就已存在) <dependency> <groupId>io.netty</groupId> <artifactId>netty-all</artifactId> <version>5.0.0.Alpha2</version> </dependency> 2) 例子代码(LocalTime是Java8的时间类) import io.netty.util.HashedWheelTimer; import java.time.LocalTime