当单线程遇到了多线程
以下, 纯属个人的一些想法,不一定正确.
- 在单线程的环境下,我们把任务按照它要执行的过程一个个顺序编写,它便能让任务也按照这个时间轴顺序执行.
- 多线程编程环境,这种套路就不行了,顺序地编排任务是不能保证任务的执行也是顺序的。所以, 我们将下个任务放在当前任务的结束点上去编排, 这样就保证了任务的时间轴执行,以达到程序的正确性.
回调也没那么恐怖吧
-
多线程环境下,我们将下个任务编排到当前任务的结束点上,以达到正确性。外加面向对象的设计规范,我们一般不会去让任务之间这么直接耦合,而是设计一个接口暴露出来,然后将下个任务放在这个接口处,这样子就是我们的回调了.
-
将任务的添加放到了程序执行它的地方
- 这种回调设计其实和单线程编写程序有一个共同点,就是都把任务放在了该执行它的地方。
-
可是添加和执行是一个东西吗
-
我们已经习惯了将任务添加在它将要执行的地方,这里的添加和执行就像一个东西一般。忽然觉得可以把这两个东西分开看,不一定非要把任务的添加放在它执行的地方,我们分别对待它。
-
如果将任务的添加和执行分开,我们在任务执行前已经添加进去了, 那么在上个任务结束点时候自动去执行它,就不需要回调去衔接下个任务了. 任务的调度对外也可以完全关闭, 这样子程序是不是就干净了.因为执行点是随机的,但是添加点却是可控的.
-
分开试试
-
如何做到任务的添加与执行分开
- 来看下怎么搞吧, 如果一开始有a, b, c, d四个任务,我让a持有了b , b持有了c, c持有d, 构成了这样的链条,那么上游的任务就持有了下游任务, 这个时候我们并不执行,只是为了串联起一个任务链a->b->c->d. a.subs(b {b_task} ).subs(c {c_task}).subs(d).这和rxjava的反向订阅基本差不多.
- 当任务执行的时候, 因为任务串联好了,便可以按照这个链条执行了。
- 至于线程切换,简单搞搞, 可以在b_task执行完之后,内部调用c_task时候主动切一下,这并不影响我们的调用链结构.
来个总结吧
- 任务的执行和添加其实是可以分开的,执行的节点随着线程的多变是分散各处的, 如果我们还是保持二者合一,程序的编写也就要四散各处.这就不利程序结构的设计,无法紧凑起来.
- 反向订阅:对外表象是一个时间轴顺序的任务链,它让我们的程序结构更好。因为它的订阅不是执行, 只是为了串联起一个任务链,所以不会影响程序的正确性。
- 很多人说Rxjava的核心是观察者模式, 但回调也是啊, 我觉得这里反向订阅很重要,而分离任务的添加和执行也很重要哦。