关于Handler源码问一个问题
来源:5-2 Android绘制原理及工具选择

用户1148542
2019-02-25
关于Handler源码问一个问题 在ActivityThread 中main()方法中有一行代码: Looper.loop();它里面有一个死循环, for (;;) {},如果没有消息的时候会不会卡住,我知道不会,但不知道原因
写回答
2回答
-
随风绽放
2019-02-27
同学你好,在循环中是不会被卡主的,主线程的死循环一直运行是不是特别消耗CPU资源呢? 其实不然,这里就涉及到Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,详情见Android消息机制1-Handler(Java层),此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的。 所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源。
真正可能被卡主的是每个Msg的执行
00 -
企鹅啊但是我
2019-02-26
做一次搬运工:www,zhihu,com/question/34652589
个人感觉讲解的很透彻
022019-02-27
相似问题