线程的消息屏障

消息分类

参考文章 Handler之消息屏障
消息可以分为三种

  1. 普通消息(同步)normal
  2. 屏障消息(同步)barrier
  3. 异步消息async

我们通常使用的都是普通消息,而屏障消息就是在消息队列中插入一个屏障,在屏障之后的所有普通消息都会被挡着,不能被处理。不过异步消息却例外,屏障不会挡住异步消息,因此可以这样认为:屏障消息就是为了确保异步消息的优先级,设置了屏障后,只能处理其后的异步消息,同步消息会被挡住,除非撤销屏障。

我们如何在消息队列中插入一个消息屏障?

postSyncBarrier()
需要注意6点:

  1. 这个消息是没有target的(handler);
  2. 也是带了时间戳的,只会影响它后面的消息;
  3. 一个消息队列是可以插入多个消息屏障的
  4. 消息屏障插到消息队列之后是没有唤醒消息线程的
  5. 插完屏障消息之后会返回一个token,是这个屏障的序列号,可用于之后需要撤除消息屏障时,通过token在消息队列查找
  6. postSyncBarrier()这个api是没有开放的,如果需要使用,只能通过反射调用(我们正常的enqueuemessage是会判断msg.target是否为null,是则会抛出异常)
 @RequiresApi(api = Build.VERSION_CODES.M)
    private void sendSyncBarrier() {

        try {
            MessageQueue queue = mHandler.getLooper().getQueue();
            Method method = MessageQueue.class.getDeclaredMethod("postSyncBarrier");
            method.setAccessible(true);
            int token = (int) method.invoke(queue);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

在这里插入图片描述

删除屏障
从消息队列中删除,唤起线程

在这里插入图片描述
原理
在这里插入图片描述

在这里插入图片描述

引申出的几个问题:
1.消息队列是空的时候,插入一个屏障,会触发idleHandler吗?
答:不会。插入一个屏障,不会唤醒线程,无法进入到nativePollOnce之后的操作。
2.如果删除了屏障,消息队列空了,是否会触发idleHandler?
答:不会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值