LiteGo源码分析

2016-08-25  本文已影响51人  linheimx

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

福利时间

上一篇下一篇

猜你喜欢

热点阅读