【问题标题】:Why still calling nativeWake() when the thread not blocking?当线程没有阻塞时,为什么还要调用 nativeWake()?
【发布时间】:2019-08-14 16:10:16
【问题描述】:

当线程没有阻塞时,为什么还要调用nativeWake()

当一个线程调用enqueueMessage()方法时,说明线程没有阻塞,但是为什么还要调用nativeWake()呢?

MessageQueue#enqueueMessage

boolean enqueueMessage(Message msg, long when) {

       ……
            if (needWake) {
                nativeWake(mPtr);
           }
     }

【问题讨论】:

    标签: android android-handler android-looper


    【解决方案1】:

    当所有消息都在等待时,你调用 enqueue 到其中一个,它只是检查头部,以防一些重要的东西刚刚安装在顶部。

            //Log.d("MessageQueue", "Enqueing: " + msg);
            Message p = mMessages;
            if (p == null || when == 0 || when < p.when) {
                msg.next = p;
                mMessages = msg;
                needWake = mBlocked; // new head, might need to wake up
            } else {
                Message prev = null;
                while (p != null && p.when <= when) {
                    prev = p;
                    p = p.next;
                }
                msg.next = prev.next;
                prev.next = msg;
                needWake = false; // still waiting on head, no need to wake up
            }
        }
        if (needWake) {
            nativeWake(mPtr);
        }
    

    所以你只是跳过了重要的部分。

    【讨论】:

    • 这个线程的状态是什么?等待?运行?如果等待,为什么还能调用 enqueue?
    • 抱歉耽搁了。当有人调用 enqueueMessage 时,它​​内部已经有线程监视器可以工作。所以一开始就处于运行状态。
    猜你喜欢
    • 1970-01-01
    • 2020-08-06
    • 2021-10-19
    • 2015-04-27
    • 2013-11-16
    • 1970-01-01
    • 2017-04-14
    • 2017-10-03
    • 1970-01-01
    相关资源
    最近更新 更多