多消息顺序执行问题的一次实践
最近在项目中遇到一种场景,在短时间内会收到多条消息,但是需要按照顺序执行。即先执行消息A,再执行B,再执行C,这样顺序执行。
想到了用队列,有序队列LinkedBlockingQueue,默认是无界队列,且是线程安全的。内部实现是通过链表,线程安全是通过ReentrantLock(可重入锁)实现的,ReentrantLock这里不展开讲,他是通过CAS机制实现线程安全,和synchronized 不一样。
synchronized 是在JVM层级实现的,通过monitor对象来实现锁机制。所有我不需要关注锁定释放,JVM已经给我们做好了。ReentrantLock是api级别的接口是通过算法实现的锁机制。需要我们自己去lock和unlock。这里就不展开了。
出列和入列方法
方法 | 抛出异常 | 返回特定值 | 阻塞 | 阻塞特定时间 |
---|---|---|---|---|
入队 | add(e) |
offer(e) |
put(e) |
offer(e, time, unit) |
出队 | remove() |
poll() |
take() |
poll(time, unit) |
获取队首元素 | element() |
peek() |
不支持 | 不支持 |
综合考虑到端侧没有太多消息入列,我们使用offer()入列,使用take()出列。
通过HandlerThread 在非UI线程中执行队列的消息执行操作。
模拟点击添加消息到队列中