TaskScheduler的分析

    技术2022-05-13  8

    前面说到了 在 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的参数给出。


    最新回复(0)