Handler的核心能力
- 线程间通信
- 延迟任务执行
sendMessageDelayed(Message msg, long delay)
postDelayed(Runnable r, long delay)
Looper的核心能力
- Looper是线程特有的,所以要有ThreadLocal
- 包含MessageQueue
loop()
方法,在死循环中获取消息队列中的消息,分发给handler处理
MessageQueue的核心能力
- 持有消息(链表)
- 消息按时间排序(优先队列)
- 队列为空的时候阻塞读取(阻塞队列)
- 头节点有延时可以定时阻塞(延时阻塞队列)
使用DelayQueue
Message
仿造Android的message
类结构
DelayQueue
实现BlockingQueue接口(实现阻塞功能)
有PriorityQueue对象(可以优先排序)
DelayQueue的阻塞机制:通过condition.await方法
存在的问题
没有实现remove的方法
为什么Android不直接使用DelayQueue作为消息队列
- DelayQueue没有提供合适的remove机制
- 更大的自由度,可以定制许多功能,特别是与Native层结合
- Android的MessageQueue可以针对单线程读取的场景做优化,只有插入队列的时候加锁,而读取的时候不用加锁;DelayQueue读写都加锁