美文网首页
LiteGo源码分析

LiteGo源码分析

作者: linheimx | 来源:发表于2016-08-25 17:20 被阅读51次

    SmartExecutor

    他是一个执行器

    Paste_Image.png

    通过这个执行器,你可以很轻松的控制一堆任务的执行,

    1. 设置并发的数量
    2. 设置排队的数量
    3. 设置调度策略
    4. 设置过载策略。

    基础知识

    想要明白 SmartExecutor 是如何运转的,我们首先要明白几个概念。

    1. Executor 是什么?

    简单的说:

    执行器就是一个 可以执行 Runnable 任务的对象。
    Executor这个接口提供了一种解耦的方式:每个任务的具体定义,和每个任务的执行相分离。(执行:线程的使用,调度等等)。

    具体见我的这篇文章 Excutor(very good)

    2. ExecutorService是什么?

    litego 中很多思想应该是来自这里。

    具体见我的这篇文章 ExecutorService(very good)

    一堆任务的控制

    你可以把一堆任务抛给 SmartExecutor,怎么抛给它?
    如下图,好多种姿势:

    Paste_Image.png

    最终会都会执行这个方法:

    Paste_Image.png

    这堆任务怎么管理?
    把他们放到集合里面,你想怎么管理,就怎么管理!

    你把兔子放到笼子里面,想让哪只出来跑,就让哪知出来跑。
    想把兔子放到哪知笼子,就放到哪知笼子。 嘿嘿

    litego是这样处理的:

    Paste_Image.png Paste_Image.png

    过载策略:

    1. DiscardNewTaskInQueue:把等待队列中的 最后一个任务抛弃掉。
    2. DiscardOldTaskInQueue: 把等待队列中的 第一个任务抛弃掉。
    3. CallerRuns:直接在当前线程中运行。
    4. DiscardCurrentTask:直接抛弃。
    5. ThrowExecption:抛出异常。

    现在问题来了:
    一个任务执行完毕了,如何去执行等待队列中的下一个任务?
    答案就是,一个任务执行完毕,就去等待队列中的下一个任务。
    只需要wrap当前的runnable就可以了:

    Paste_Image.png

    这个思想跟 Executor 官方提供的例子很像。

    Paste_Image.png

    当去执行等待队列中的任务的时候,就可以控制调度策略了:

    Paste_Image.png

    针对过载策略,litego这样的处理跟 ThreadPoolExecutor 中RejectedExecutionHandler的处理一个思想:

    Paste_Image.png

    福利时间

    相关文章

      网友评论

          本文标题:LiteGo源码分析

          本文链接:https://www.haomeiwen.com/subject/iajasttx.html