• Dispatcher


    Dispatcher是guava EventBus的事件分发器.

    Dispatcher是抽象类, 抽象方法: abstract void dispatch(Object event, Iterator<Subscriber> subscribers);
    定义了3个内部类: ImmediateDispatcher LegacyAsyncDispatcher PerThreadQueuedDispatcher.
    这3个类是Dispatcher的实现.

    LegacyAsyncDispatcher现在用PerThreadQueuedDispatcher代替

    Subscriber包括EventBus, Object target, Method method, Executor executor.

     1   final void dispatchEvent(final Object event) {
     2     executor.execute(new Runnable() {
     3       @Override
     4       public void run() {
     5         try {
     6           invokeSubscriberMethod(event);  // 调用method, method.invoke(target, event)
     7         } catch (InvocationTargetException e) {
     8           bus.handleSubscriberException(e.getCause(), context(event));
     9         }
    10       }
    11     });
    12   }

    Subscriber的dispatchEvent()

    1  @Override
    2     void dispatch(Object event, Iterator<Subscriber> subscribers) {
    3       checkNotNull(event);
    4       while (subscribers.hasNext()) {
    5         subscribers.next().dispatchEvent(event);
    6       }
    7     }

    ImmediateDispatcher的dispatch()

      void dispatch(Object event, Iterator<Subscriber> subscribers) {
          checkNotNull(event);
          checkNotNull(subscribers);
          Queue<Event> queueForThread = queue.get();  // Queues.newArrayDeque()
          queueForThread.offer(new Event(event, subscribers));
    
          if (!dispatching.get()) {
            dispatching.set(true);  // 是线程安全的
            try {
              Event nextEvent;
              while ((nextEvent = queueForThread.poll()) != null) {
                while (nextEvent.subscribers.hasNext()) {
                  nextEvent.subscribers.next().dispatchEvent(nextEvent.event);
                }
              }
            } finally {
              // 清除
              dispatching.remove();
              queue.remove();
            }
          }
        }
    1 PerThreadQueuedDispatcher的dispatch()
    2 
    3 PerThreadQueuedDispatcher包括ThreadLocal<Queue<Event>> queue和ThreadLocal<Boolean> dispatching
    4 
    5 dispatching表示是否正在执行dispatch, queue用于让每个线程有一个独立的事件队列.
  • 相关阅读:
    《秒杀系统架构分析与实战 》
    《豆瓣的基础架构》
    转--《亿级用户下的新浪微博平台架构 》
    转-《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践 》
    hdu2029
    hdu2027
    hdu2026(water~~)
    PHP电影小爬虫(2)
    今天来做一个PHP电影小爬虫。
    PHP Simple HTML DOM解析器
  • 原文地址:https://www.cnblogs.com/lijia0511/p/5742554.html
Copyright © 2020-2023  润新知