1. 首先我们不要弄混了消息等待阻塞(休眠)和消息处理阻塞,消息等待阻塞会导致主线程进入休眠,不会ANR,而消息处理阻塞会导致ANR。
2. 休眠不会阻碍主线程对新消息的感知和处理(有消息会被唤醒),但消息处理阻塞会,现在你们明白系统为什么要给主线程设置5秒的超时限制了吧。
3. 当没有消息时,queue.next()会阻塞在nativePollOnce(),这里涉及到Linux pipe/epoll机制,nativePollOnce()被阻塞时,主线程会释放CPU资源,进入休眠状态。如果此时来了新消息,比如vSync、用户操作、系统广播等,主线程会从休眠中唤醒,处理完新消息后,再次queue.next()进入休眠,如此反复。
4. 总体来说该机制是为了节省和充分利用CPU资源。