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用于让每个线程有一个独立的事件队列.
  • 相关阅读:
    Linux 常用命令
    公钥,私钥和数字签名
    MySQL中的datetime与timestamp比较
    SQL开发技巧
    socket心跳包机制
    vue 路由回退,实现刷新原页面数据
    HTTP1.0、HTTP1.1 和 HTTP2.0 的区别
    Xshell常用命令
    学习Dart flutter --1
    学习JavaScript数据结构与算法(第2版)--01
  • 原文地址:https://www.cnblogs.com/lijia0511/p/5742554.html
Copyright © 2011-2022 走看看