事件节点及优先队列 关系解析
涉及5个类,分别是: EventNode
, Event
, EventTree
, BaseEvent
, EventHandle
, ProcessTarget
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) | 克隆一个指定节点 |
接口:
interface Runner {
void runOnNode(EventNode node);
}
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) | 构造函数 |
---|---|