最近在看LIVE555的源码,感觉其中的延时队列写的不错,于是就总结一下。
    首先描述一下LIVE555中的延时队列的设计理念。首先,如下图,A,B,C分别为时间轴上的三个事件点,而head表示当前时间点。

假如我们要描述一个事件发生的时间,可以有两种方法:一种方法直接描述事件发生的绝对时间;另一种方法则是可以描述和另一事件发生的相对时间。而LIVE555中采用的就是后者。在LIVE555中,首先将所有的事件点以发生时间的先后进行排序,然后每个事件对应的时间都是相对于前一事件发生的时间差。比如B事件中存储的时间就是A事件触发后,再去触发B事件所需要的时间。这样,我们每次去查询这个队列中是否有事件被触发的时候,就只需要查询整个队列中的第一个事件就可以了。
     然后就是LIVE555中的实现方法了。整个延时队列是用DelayQueue这个类实现的,而它的基类DelayQueueEntry就是用来描述每个事件节点的。在DelayQueueEntry中的主要成员有以下几个:fDelayTimeRemaining表示的就是与前一事件之间的时间差;fNext和fPrev就是指向时间轴上的下一个事件和前一个事件的指针;ftoken表示当前节点的标识;handleTimeout就是事件超时后的处理方法。
     而DelayQueue类里描述的则是具体的实现方法。首先是一些对这个队列进行的基本操作:addEntry实现的是在队列中增加事件节点;removeEntry实现的是在队列中删除某事件节点;updateEntry实现的则是更新某事件的触发时间;而findEntryByToken则是根据节点的标识查找相应的事件。在此类中最常用的方法应该是synchronize,它实现的就是将整个事件队列和当前系统时间进行同步,检测有无事件已经被触发,如果触发并调用handleAlarm方法对相应事件进行处理。而属性fLastSyncTime表示的就是上次同步的系统时间,其实一般情况下,方法synchronize的实现方法其实就是简单地把队列上第一个事件节点存储的时间差减去当前系统时间和上次同步时间的差。
     基本的实现方法应该就这些,如果大家对这个延时队列感兴趣的话,可以去阅读LIVE555的源码。

转载于:https://www.cnblogs.com/nightwatcher/archive/2011/04/10/2011158.html

简析LIVE555中的延时队列相关推荐

  1. JAVA中的延时队列DelayQueue

    Java中的延时队列DelayQueue是基于优先队列PriorityQueue实现的. 注:PriorityQueue是基于堆(Heap)实现的.堆(Heap)在本质上是一个数组. Priority ...

  2. linux proc大量文件夹,简析Linux中 /proc/[pid] 目录的各文件

    Linux 内核提供了一种通过 proc 文件系统,在运行时访问内核内部数据结构.改变内核设置的机制.proc 文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系 ...

  3. 51单片机的io口可不可以接gnd_纯干货!简析单片机中的高阻态

    在我们刚一开始接触到51单片机的时候对P0口必须加上上拉电阻,否则P0就是高阻态. 对这个问题可能感到疑惑,为什么是高阻态?加上拉电阻?今天针对这一概念进行简单讲解.高阻态 高阻态这是一个数字电路里常 ...

  4. 简析面向对象中的继承,原型链,闭包之继承

    为什么80%的码农都做不了架构师?>>>    我们理解的继承简单来说就是拿来主义:自己没有,别人有,把别人的拿过来使用或者让其成为自己的.那么如何实现继承呢? 一,混入继承 由于一 ...

  5. 简析项目中常用的七参数转换法和四参数转换法以及涉及到的基本测量学知识...

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.背景 在了解这两种转换方法时,我们有必要先了解一些与此相关的基本知 ...

  6. 简析Android中的MVC、MVP架构

    MVC MVC是指Modle,View和Controller,将界面,业务逻辑和控制器分开,是一种低耦合的设计方式,适用于简单应用开发.举个简单的例子.android中的各种控件,即为View.例如, ...

  7. 简析Java中的Serializable与Android中的Parcelable序列化

    文章目录 关于序列化 Serializable 简述原理 怎么使用 Parcelable Parcelable的实现原理 "包装公司"Parcel 装包 拆包 小结 Parcela ...

  8. 简析java中的正则表达式

    一.简介 正则表达式可以用字符串来描述规则,并用来匹配字符串. 使用正则表达式的好处有哪些?一个正则表达式就是一个描述规则的字符串,所以,只需要编写正确的规则,我们就可以让正则表达式引擎去判断目标字符 ...

  9. 简析 JSON 中的{}与[]

    [] 与  {} 在 JSON 里 [] 是 Array(也就是数组)   {} 是Ojbect(也就是对象) [] Array 的key 是 int.  {} 的key 是 string 例如 va ...

最新文章

  1. docker mac python_Docker Python 例子
  2. assignment makes pointer from integer without a...
  3. 一次性无重复配置VS项目插件属性的方法
  4. python查询数据库,打印查询结果过程中出现'NoneType' object is unsubscriptable
  5. 百度指数可视化_可视化指数
  6. jquery.cookie.js操作cookie实现“记住密码”
  7. Moodle: 登记学生,检测学生是否存在在课程 Check if user is enrolled or enroll a user in course...
  8. 字符数组中查找字符串或字符数组
  9. 我的Android进阶之旅------Android【设置】-【语言和输入法】-【语言】列表中找到相应语言所对应的列表项
  10. cashfiesta广告与传销?
  11. html取消波浪线,PPT文字下划波浪线如何去掉?
  12. xlrd读取多个sheets
  13. 宝真酒业:借助用友U8cloud数智化转型,小集团也能“小而美”
  14. DQN(Deep Q Network)及其代码实现
  15. vim编辑页面怎么退出_linux系统中如何进入退出vim编辑器
  16. LeetCode 188. Best Time to Buy and Sell Stock IV(股票买卖)
  17. trino与ranger集成
  18. 无线技术应用—浅谈红外技术和卫星通信(个人向)
  19. size = 8 * sizeof(int)是什么意思?详解代码为啥这么写?
  20. mysql恢复单个数据,error code 1815

热门文章

  1. ripro虚拟资源主题8.9开心版/免授权/ripro日主题V8.9
  2. 紫色管理系统UI bootstrap后台模板
  3. WCF必知必会以及与Webapi的区别
  4. SQL知识你了解多少?
  5. SQL Server 2000订阅与发布的具体操作
  6. jQuery模拟原生态App上拉刷新下拉加载效果代码
  7. 什么是MARC数据?
  8. 树模型——机器学习面试
  9. Linux——VIM学习选取多行(转)
  10. LeetCode 88. Merge Sorted Array