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用于让每个线程有一个独立的事件队列.
  • 相关阅读:
    第三十四节(java-实现在线翻译)
    第三十三节(java-操作Excel实现企业级批量处理大数据)
    第三十二节( Java-实现体育彩票开奖系统)
    第三十一节(java-实现QQ空间访问量统计系统)
    第三十节(java-实现水印图片)
    使用VBA批量CSV转XLS(97-2003)
    WPF中Datagrid控件添加行号
    简单多播委托Demo
    使用Linq查找重复
    简单的操作符重载,笔记
  • 原文地址:https://www.cnblogs.com/lijia0511/p/5742554.html
Copyright © 2011-2022 走看看