Есть ли ситуации, когда messageQueue существует асинхронное сообщение, но поток по-прежнему заблокирован? - PullRequest
0 голосов
/ 02 июня 2019

Проблема:

if (needWake && p.isAsynchronous())

  • , какая сцена вызовет это состояние?

  • почему нет необходимости пробуждать поток, когда возвращается true?

Android MessageQueue :

boolean enqueueMessage(Message msg, long when) {

        // ... Omit part of the code

        synchronized (this) {

            // ... Omit part of the code

            Message p = mMessages;
            boolean needWake;
            if (p == null || when == 0 || when < p.when) {
                msg.next = p;
                mMessages = msg;
                needWake = mBlocked;
            } else {
                needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                for (;;) {
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {
                        break;
                    }

                    if (needWake && p.isAsynchronous()) {
                        needWake = false;
                    }
                }
                msg.next = p;
                prev.next = msg;
            }

            if (needWake) {
                nativeWake(mPtr);
            }
        }
        return true;
    }
...