问题
PerThreadQueuedDispatcher.dispatch()
将事件和订阅者封装到一个 Event 对象中并将其提供给线程本地队列,然后轮询它以执行与ImmediateDispatcher.dispatch()
相同的逻辑有什么意义?- dispatching.get() 总是返回 false 吗?为什么呢?
源码部分
ImmediateDispatcher#dispatch()
1 | scss复制代码void dispatch(Object event, Iterator<Subscriber> subscribers) { |
PerThreadQueuedDispatcher#dispatch()
1 | vbnet复制代码void dispatch(Object event, Iterator<Subscriber> subscribers) { |
假设条件
- 同一个线程中,执行过程中存在
事件
嵌套现象,具体为一个事件 A 触发了事件 B 和 C,而事件 B 又触发了事件 D
验证
1 | typescript复制代码class Test { |
将这些事件视为一种树,其中每个事件都会产生额外的“子”事件:
1 | css复制代码 A |
有两种常见的遍历树的方式:深度优先(A、B、D、C)和广度优先(A、B、C、D)。这就是两个调度器之间的区别。
1 | typescript复制代码class Test { |
我们可以将这些事件视为一种树,其中每个事件都会产生额外的“子”事件:
1 | css复制代码 A |
有两种常见的遍历树的方式:深度优先(A、B、D、C)和广度优先(A、B、C、D)。这就是两个调度器之间的区别。
直接调度程序在事件创建时对其进行处理,从而导致深度优先调度。
执行步骤为: A->B->D->C
排队调度器在事件被提交时将它们排队,并通过轮询队列来处理它们,从而导致广度优先调度。该dispatching
标志用于将队列处理限制为根事件。子事件将找到设置的标志并继续前进。
执行步骤为: A->B->C->D
总结
- ImmediateDispatcher 在事件处理上,属于深度优先调度
- PerThreadQueuedDispatcher 通过
dispatching
线程执行标示位和queueForThread
执行队列 ,在调度上属于广度优先调度
\
本文转载自: 掘金