-
Notifications
You must be signed in to change notification settings - Fork 778
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2019-10-22:Handler中有Loop死循环,为什么没有阻塞主线程,原理是什么? #170
Comments
我不太明白, 阻塞-挂起-block-suspend, 暂时混为一谈; 主线程挂起Looper 是一个死循环, 不断的读取MessageQueue中的消息, loop 方法会调用 MessageQueue 的 next 方法来获取新的消息, 系统怎么实现的阻塞与唤醒这种机制是通过pipe(管道)机制实现的; 即当管道中有内容可读时, 就唤醒当前正在等待管道中的内容的线程; 怎么证明, 线程被挂起了
|
不久之前,知乎上看到的答案,很不错,贴出来,不再重复造轮子,有限的时间要花在好的东西上 |
可以这样简单的来理解一下,一个Thread对应一个Looper和一个MessageQueue 综上所述,线程并没有一直死循环的工作,而是在没消息时被暂时挂起了,当有新消息进来的时候,就会又开始工作。 |
我们的所说的阻塞主线程,其实指的是 ActivityThread 这个线程,它维护为一个叫做 H 的 Handler,Activity 的启动等都是通过它来实现的。 |
这个跟快递分类一样,传送带上有包裹的时候,领导会叫你开始干活(唤醒),没包裹的时候睡觉(nativePollOnce-挂起),让出cpu低成本运行,不会消耗太大的性能 |
简单一句话是:Android应用程序的主线程在进入消息循环过程前,会在内部创建一个Linux管道(Pipe),这个管道的作用是使得Android应用程序主线程在消息队列为空时可以进入空闲等待状态,并且使得当应用程序的消息队列有消息需要处理时唤醒应用程序的主线程。---这一题是需要从消息循环、消息发送和消息处理三个部分理解Android应用程序的消息处理机制了, 非原创 |
准确的讲,阻塞也是阻塞了的,只不过是暂时的(UI线程阻塞,让出CPU),即没消息或消息还未到处理时间。等用户跟app交互后或者队列里的消息到时间了,UI线程会被再次唤醒,继续往下执行。 |
No description provided.
The text was updated successfully, but these errors were encountered: