ONOS eventDispatcher代码分析

首先看defaultEventSinkregistry类,该类中使用了ConcurrentHashMap来存储事件池,事件为key,eventSink为相对应的value


在CoreEventDispatcher中,首先定义了默认执行时间为5000ms,watchdog为250ms,使用了阻塞队列来处理events,并创建了一个单线程化的线程池,保证所有任务按照顺序执行。newSingalThreadPool源码中FinalizableDelegatedExecutorService使用了代理模式,真正调用的是threadPoolExecutor,threadPoolExecutor中使corePoolSize和maximumPoolSize都为1,以此实现单线程化的线程池。



在ONOS控制器中的事件监听器最后提到,post方法其实是调用了eventDispatcher的post方法,这里为post方法的具体实现,events为blockingQueue类,调用add方法,把event加入阻塞队列,add()方法如果加入成功会返回true,如果队满会抛出异常

下面进入activate方法,首先初始化dispatchloop,首先用volatile关键字保证diapatchloop的状态是对所有线程可见的,线程开始时,将stop状态设为false,开始while死循环。从events队列里取出下一个要执行的event,如果event取得KILL_PILL事件时就会跳出循环(当deactivate方法调用时会向队列里提交一个KILL_PILL事件)。下一步就是pocess event


回到activate方法,dispatchFuture是一个异步返回类,将dispatchLoop提交上去进行处理,启动watchDog,watchDog用来检测线程运行时间,一旦线程运行事件超过提前设定的最大运行时间,就会终止当先的dispatch loop并且提交一个新的。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,645评论 8 265
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,991评论 19 139
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,145评论 1 32
  • 其实今天只写一件事就够了:中午在趴桌子上迷糊半小时之后,起身出去,想起来要把上午晒的被子收了,虽然天气预报是暴雨,...
    良辰美LiangChen阅读 216评论 0 0
  • 当你逛淘宝时,面对众多的商品,是否让你不知如何选择?走进一家小餐馆,面对眼花潦乱的菜单,是否不知到底该吃啥?手机里...
    Mr波波阅读 293评论 0 6