zoukankan      html  css  js  c++  java
  • 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用于让每个线程有一个独立的事件队列.
  • 相关阅读:
    c++ 获取某个进程个数
    Hadoop集群配置【三、多节点部署】
    *** glibc detected *** [没事写写Bug]
    Mahout in action 中文版3.推荐器的数据表达3.2
    simHash原理【转】
    Mahout in action 中文版2.推荐器的介绍2.4~2.6
    Hadoop集群配置【四、Hbase部署】
    mongodb driver 编译失败,各种undefine
    Mahout in action 中文版2.推荐器的介绍2.1~2.2
    Mahout in action 中文版3.推荐器的数据表达3.3~3.4
  • 原文地址:https://www.cnblogs.com/lijia0511/p/5742554.html
Copyright © 2011-2022 走看看