TaskScheduler的分析_2

来源:互联网 发布:js currenttarget id 编辑:程序博客网 时间:2024/05/16 16:03

前面说到了 在 TaskScheduler中可能包含3个链表。

然后我们继续看TaskScheduler的子类 BasicTaskScheduler就可以到里面有一个这个成员变量:

DelayQueue    

fDelayQueue;

 

fDelayQueue就是我们前面说的其中一个链表,这个链表是跟DelayedTask相关的。

然后我们来继续看DelayQueue这个链表类,它的节点是DelayQueueEntry。这是一个双向、循环列表,所以每个节点必须包含其前后节点的指针。

在源码里面DelayQueueEntry的结构是这样的:

private:

friend class DelayQueue;

DelayQueueEntry* fNext;

DelayQueueEntry* fPrev;

DelayInterval         fDeltaTimeRemaining;

long                       fToken;

staitc long              tokenCounter;

public:

virtual void handleTimeOut();

这个节点里面内容有2个:

fDeltaTimeRemaining,这是一个跟时间相关的类,在这里我们完全可以把它当成一个long型数据。

fToken,则可以看作是一个标识码,不同的DelayQueueEntry对应不同的数字,它是通过tokenCounter对它赋值的。

然后里面有个函数 handleTimeOut这个函数代表如果 时间到了(fDeltaTimeRemaining==0)或者超时了要进行什么操作,这个操作是由它的子类来完成的。

然后我们再回来看DelayQueue这个链表,它包含一个表头,表头的前后指针都指向自己,fDeltaTimeRemaining为无限大。fToken应该为1.

链表有些操作,不外乎是 添加和删除节点,然后是更新节点。

所以前面说的3个函数:

scheduleDelayedTask

unscheduleDelayedTask

rescheduleDelayedTask

就是添加和删除链表的节点了,淡然这里面节点不是基类DelayQueueEntry而是它的子类: AlarmHandler,这个类主要重写了handleTimeOut这个函数,在这个函数里面表明如果超时了 就执行一个对应的函数,函数以及函数的参数由scheduleDelayedTask的参数给出。

原创粉丝点击