LiteGo源码分析
2016-08-25 本文已影响51人
linheimx
SmartExecutor
他是一个执行器
Paste_Image.png通过这个执行器,你可以很轻松的控制一堆任务的执行,
- 设置并发的数量
- 设置排队的数量
- 设置调度策略
- 设置过载策略。
基础知识
想要明白 SmartExecutor 是如何运转的,我们首先要明白几个概念。
1. Executor 是什么?
简单的说:
执行器就是一个 可以执行 Runnable 任务的对象。
Executor这个接口提供了一种解耦的方式:每个任务的具体定义,和每个任务的执行相分离。(执行:线程的使用,调度等等)。
具体见我的这篇文章 Excutor(very good)
2. ExecutorService是什么?
litego 中很多思想应该是来自这里。
具体见我的这篇文章 ExecutorService(very good)
一堆任务的控制
你可以把一堆任务抛给 SmartExecutor,怎么抛给它?
如下图,好多种姿势:
最终会都会执行这个方法:
Paste_Image.png这堆任务怎么管理?
把他们放到集合里面,你想怎么管理,就怎么管理!
(
你把兔子放到笼子里面,想让哪只出来跑,就让哪知出来跑。
想把兔子放到哪知笼子,就放到哪知笼子。 嘿嘿
)
litego是这样处理的:
Paste_Image.png Paste_Image.png过载策略:
- DiscardNewTaskInQueue:把等待队列中的 最后一个任务抛弃掉。
- DiscardOldTaskInQueue: 把等待队列中的 第一个任务抛弃掉。
- CallerRuns:直接在当前线程中运行。
- DiscardCurrentTask:直接抛弃。
- ThrowExecption:抛出异常。
现在问题来了:
一个任务执行完毕了,如何去执行等待队列中的下一个任务?
答案就是,一个任务执行完毕,就去等待队列中的下一个任务。
只需要wrap当前的runnable就可以了:
这个思想跟 Executor 官方提供的例子很像。
Paste_Image.png当去执行等待队列中的任务的时候,就可以控制调度策略了:
Paste_Image.png针对过载策略,litego这样的处理跟 ThreadPoolExecutor 中RejectedExecutionHandler的处理一个思想:
Paste_Image.png