내 가 알 고 있 는 Message Queue 의 메시지 저장 과정

2205 단어 분석 하 다.
문제.
  • Handler 에 대해 우 리 는 잘 알 고 있 습 니 다. 우 리 는 항상 이렇게 mHandler. sendmessage (msg) 를 사용 합 니 다. 그리고 항상 이렇게 mHandler. sendmetymessage Delayed (0, 1000) 를 사용 합 니 다. 그러나 우 리 는 handler 처리 메 시 지 는 모두 하나의 처리 라 는 것 을 알 고 있 습 니 다. 우리 가 보 낸 메 시 지 는 모두 메시지 대기 열 에 먼저 저장 되 지만 이 메시지 대기 열 은 어떻게 이 루어 집 니까?

  • 개인 적 이해
  • 그 전에는 이 대열 의 알고리즘 이 어 려 울 것 이 라 고 생각 했 지만 최근 에 소스 코드 를 본 후에 핵심 코드 가 20 줄 (대 박) 을 넘 지 않 았 습 니 다. 이 대열 의 핵심 사상 은 모든 Message 간 에 손 을 잡 는 것 입 니 다. 즉, 모든 Message 는 자신의 앞의 Message 와 뒤의 Message 만 알 면 됩 니 다. Message 간 의 순 서 는 시간 스탬프 로 정렬 됩 니 다.시간 스탬프 가 앞 에 줄 지어 있다.
  • 그리고 handler 가 메 시 지 를 꺼 내 는 데 협조 한다. 첫 번 째 Message 시간 이 되면 대열 의 첫 번 째 Message 를 가 져 오고 첫 번 째 Message 를 비 워 두 면 두 번 째 Message 가 첫 번 째 에 랭크 된다.

  • 코드 구현
    //     
    boolean enqueueMessage(Message msg, long when) {
        synchronized (this) {
            msg.when = when;
            Message p = mMessages;   //  1
            if (p == null || when == 0 || when < p.when) {
                msg.next = p;
                mMessages = msg;     //  2
            } else {
                Message prev;
                for (;;) {           //  3
                    prev = p;
                    p = p.next;
                    if (p == null || when < p.when) {
                        break;
                    }
                }
                msg.next = p; 
                prev.next = msg;
            }
        }
        return true;
    }
    
  • 주석 1, 2: 메시지 가 없 을 때 mMessages 는 null 입 니 다. null 이면 현재 발생 하 는 msg 를 mMessages 에 부여 합 니 다. 이때 msg. next 는 null 입 니 다. mMessages 가 null 이 아니라면 대기 열 에 Message 가 있 음 을 설명 합 니 다. 앞에서 분석 하고 싶 습 니 다. 이 때 는 시간 스탬프 에 따라 누가 맨 앞 에 있 는 지, 새로 추 가 된 msg 가 있 으 면 정렬 합 니 다.(msg. when < p. when), 새로 추 가 된 msg 가 맨 앞 에 있 습 니 다. msg 의 다음 message 는 mMessages (msg. next = p; mMessages = msg;) 를 가리 킵 니 다.
  • 주석 3: 새로 추 가 된 msg 의 시간 스탬프 가 줄 에 있 는 첫 번 째 message, 즉 mMessages 보다 크 면 msg 는 하나씩 비교 합 니 다. 즉, 메시지 큐 의 모든 message 의 시간 스탬프 와 비교 하고 찾 은 후에 for (;) 를 뛰 어 내 린 다음 에 위치 (msg. next = p; prev. next = msg;) 를 삽입 합 니 다.이 p 는 새로 추 가 된 msg 시간 스탬프 가 p 보다 작은 message 입 니 다. prev 는 p 앞 에 있 는 message 입 니 다.
  • 여기까지 Message Queue 의 메시지 저장 과정 이 끝 났 습 니 다.
  • 종결 어
  • 당신 의 격려 와 지 도 를 받 을 수 있다 면 하루 를 즐겁게 보 낼 수 있 습 니 다. 감사합니다.
  • 좋은 웹페이지 즐겨찾기