Handler中有Loop死循环,为什么没有因为死循环卡死?

今天一个同事去面试,遇到这个问题。

我也不是很明白,去百度一圈,明白个6成,先记录下来。

这个问题有2个点:死循环 和 卡死。

1、死循环:为什么要在ActivityThread中调用Looper.loop创建死循环代码?

2、卡死是怎么产生的?

1、死循环:

android在启动app时候,创建主线程ActivityThread,主线程中执行死循环代码,作用有2个:

a、保证线程不会死,主线程如果执行结束了,那app就退出了,所以主线程不能死,就依赖这个死循环代码。

b、持续对Message进行接收、处理、发送,保证handler发过来的message都能及时被处理。

2、卡死:

手机卡死的时候,到底发生了什么?这跟cpu有关系:

扫描二维码关注公众号,回复: 11567770 查看本文章

先来认识下cpu的运行空闲机制:比如手机的CPU的频率是2GHz,这意味着每秒你手机的处理器会执行2^30Hz≈10^9条指令,而大多数时间下手机并不会用到这么高的计算速度。CPU完成上一个程序的计算任务,直到下一个计算任务被送达,这段时间间隔CPU是没有任务的状态,就是cpu空闲状态。

假设现在共有10个线程在运行,其中包含一个有死循环的线程,假设叫s线程。cpu在执行完其他的线程代码片段后,s线程立即申请cpu资源,并且是一直不停的申请,没有给cpu空闲的时间。

导致cpu一直在执行任务,使用率接近100%,cpu满负载运行,就会出现卡死现象,用户就会觉得手机卡住了。

回来说,ActivityThread线程中的死循环,之所以没有卡死,是借助linux系统的机制,会让主线程,在无消息时处于休眠状态,不占用cpu,而在handler发来Message时候,唤醒主线程,执行对message的接收、分发,处理完毕以后,主线程再次休眠。

这样就不会卡死了。

猜你喜欢

转载自blog.csdn.net/jinshitou2012/article/details/107069147