我读过一本书,
“Android 中最常见的线程通信用例是 UI 线程之间 和工作线程。因此,Android平台定义了自己的消息传递 线程之间的通信机制。 UI线程可以卸载长任务 通过发送要在后台线程上处理的数据消息。消息传递机制是一种非阻塞消费者-生产者模式,其中生产者线程和消费者线程在消息传递期间都不会阻塞。”
如何理解“非阻塞”?在我看来,如果消息队列没有消息发送给消费者线程(也许是UI线程),那么消费者线程必须等待,直到有一条消息要获取。
最佳答案
让我们首先了解一下这是什么以及他们的工作。
主线程(UI 线程):- 在 Android 应用程序中,MainThread 或 UI 线程应始终仅用于 UI 操作。 UI 操作如(UI 渲染、UI 更新、UI 事件监听、UI 上的用户操作(如滚动、UI 动画等))
如果您的主线程正在执行任何阻塞操作,例如(在数据库中插入数据、从数据库读取数据或任何其他需要大量时间才能完成的阻塞操作,以 20 秒为例)和
情况 1:- 同时,用户尝试在 UI 上执行某些操作,例如单击按钮或尝试滚动列表,但主线程无法响应用户操作正忙于您未完成的其他操作。因此在这种情况下,android 会等待 5 秒,如果主线程仍然没有响应,则显示 ANR(Android 未响应对话)。
情况 2:- 即使用户没有同时执行任何操作,并且您让主线程忙碌超过 10 秒,Android 也会显示相同的 ANR 对话。
后台线程:-后台线程或工作线程由 Android 应用程序启动,以执行一些繁重的 CPU 密集型工作,以保持主线程空闲以执行 UI 相关工作。
现在回答你的问题,你怀疑主线程是否处于等待状态以获取新消息或任何事件,那么当它处于“非阻塞”状态时,它如何是“非阻塞” >等待'状态? 等待状态并不意味着他因某个特定事件而被阻塞,在等待状态中主线程实际上是空闲的,此时任何人都可以调用他并分配工作。所以等待状态不是阻塞状态,而是非阻塞状态。
关于Android 线程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45604002/