- Handler 机制的底层逻辑就是利用 epoll + eventfd
- Android2.3开始 Google把Handler的阻塞/唤醒方案从Object#wait()/notify(),改为Linux epoll实现,why?
- 原因在于,native也引入了消息管理机制,用于提供个C/C++开发者使用,而现有的阻塞唤醒只支持java,Native也希望想java一样,main线程没有消息时进入阻塞状态,有到期消息需要执行几时过来处理?How?
- java通过jni调用Navie状态进入阻塞态
- 如果只是把阻塞唤醒移植到native曾,倒也不用epoll,用c++ 的wait、notify一样可以实现,引用epoll的与另一个原因是: Native 层支持监听自定义 Fd(比如 Input 事件就是通过 epoll 监听 socketfd 来实现将事件转发到 APP 进程的),而一旦有监听多个流事件的需求,那就只能使用 Linux I/O 多路复用技术
- eventfd 实现的是计数的功能,只要 eventfd 计数不为 0 ,那么表示 fd 是可读的。再结合 epoll 的特性,我们可以非常轻松的创建出 生产者/消费者模型