Package events.png

事件节点及优先队列 关系解析

涉及5个类,分别是: EventNodeEventEventTreeBaseEventEventHandleProcessTarget

EventHandle

描述:

  • An EventHandle provides a means to remember a future scheduled event in order to manage it’s execution. Examples of this control would be killing the event or executing it earlier than otherwise scheduled.
  • 用于跟踪即将发生的事件

属性:

BaseEvent event 即将发生的事件

方法:

public final boolean isScheduled() Returns true if this handle is currently tracking a future event.

ProcessTarget

描述:

  • 是一个抽象类,代表进程要执行的目标, process 类通过组合来实现解耦

函数:

Process getProcess() ????
void kill()
public abstract String getDescription() 描述内容
public abstract void process() 进程真正要执行的内容

BaseEvent

描述:

  • 事件抽象类

属性:

ProcessTarget target; 进程执行目标
EventHandle handle; 未来即将发生的事情

Event

描述:

  • Holder class for event data used by the event monitor to schedule future events.
  • 事件数据的持有类,事件管理器用它来管理未来事件
  • 它保存事件数据的内容都在抽象类 BaseEvent 中, 而这个类组合了一个节点 EventNode , 是为了将事件和红黑树节点关联起来

属性:

EventNode node 事件对应的红黑树节点 (可能为空?)
Event next 后继事件 (可能还维护一个链表)

EventNode

描述:

  • 它是一个红黑树的节点,此外包含了事件发生时间,同时又维护一个事件链表的头和尾。
  • EventNode 应该附属于 Event,和 Event 关联的红黑树节点,用于实现一个优先队列

属性:

long schedTick 事件发生时刻
int priority 事件调度的优先级
Event head 事件链表的表头
Event tail 事件链表的表尾
boolean red 当前节点是否为红色
EventNode left 左子树
EventNode right 右子树
EventNode nilNode 红黑树的空节点

函数:

final void addEvent(Event e, boolean fifo) 向该节点的链表种添加一个元素
final void removeEvent(Event evt) 从节点链表中移除事件
final int compareToNode(EventNode other) 和其他的EventNode 比较大小
final int compare(long schedTick, int priority) 根据事件发生的时间刻度和事件优先级比较大小
final void rotateRight(EventNode parent) 红黑树右旋
final void rotateLeft(EventNode parent) 红黑树左旋
final void cloneFrom(EventNode source) 克隆一个指定节点

接口:

  1. interface Runner {
  2. void runOnNode(EventNode node);
  3. }

EventTree

描述:

  • _EventTree_ is a custom red-black tree implementation intended to be used as the priority queue

属性:

private EventNode root 根节点
private EventNode lowest 最小值节点
private EventNode[] scratch = new EventNode[64]; 暂存空间,用来暂存父指针
private int scratchPos = 0; 暂存空间索引
private EventNode freeList = null; 可复用空闲节点链表,是一个只用到节点左子树的链表结构

函数:

private void pushScratch(EventNode n) 将节点放到暂存空间中
private void dropScratch(int n) 从后向前删除n个暂存节点
private EventNode getScratch(int n) 从scratch中,取出倒数第n个节点
private void resetScratch() 重置暂存空间(将它的索引置0)
EventNode getNextNode() 返回红黑树中最小值节点
final void reset() 重置红黑树
private void updateLowest() 更新红黑树的最小值节点,被 getNextNode() 调用即遍历找到红黑树中最小节点
final EventNode createOrFindNode(long schedTick, int priority) 根据调度刻度和优先级去查询节点,若没有则创建一个
private void insertBalance(EventNode n) 针对新插入的节点平衡红黑树
final boolean removeNode(long schedTick, int priority) 删除红黑树的指定节点
private EventNode swapToLeaf(EventNode node) 将该节点和叶子节点进行交换,删除节点时可能调用
private void deleteBalance(EventNode n) 删除节点后的平衡操作
final void runOnAllNodes(EventNode.Runner runner) 运行整棵树的所有runner
private void runOnNode(EventNode node, EventNode.Runner runner) 运行某个节点所有子树的所有runner
private EventNode getNewNode(long schedTick, int priority) 根据调度刻度和事件优先级创建一个新节点 ,在创建是考虑复用空闲节点
private void reuseNode(EventNode node) 回收空闲的节点,
private void clearFreeList() 清空空闲节点

Conditional

描述:

  • ????

方法:

public abstract boolean evaluate() ????

ConditionalEvent

描述:

  • ????

属性:

Conditional c

函数:

ConditionalEvent(Conditional c, ProcessTarget t, EventHandle hand) 构造函数

仿真进程和事件管理器 关系分析