多消息顺序执行问题的一次实践

最近在项目中遇到一种场景,在短时间内会收到多条消息,但是需要按照顺序执行。即先执行消息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线程中执行队列的消息执行操作。

模拟点击添加消息到队列中

 

posted @ 2023-07-11 17:29  玄武湖旁边的青蛙  阅读(18)  评论(0编辑  收藏  举报