我从一本书中读到,
“Android中最常见的线程通信用例是在UI线程之间 和工人的线程。因此,Android平台定义了自己的消息传递 线程之间的通信机制。 UI线程可以卸载长任务 通过发送要在后台线程上处理的数据消息。消息传递机制是 非阻塞 消费者 - 生产者模式,生成者线程和消费者线程在消息切换期间都不会阻塞。“
我怎么能理解“非阻塞”?在我看来,如果消息队列没有消息发送到消费者线程(可能是UI线程),那么消费者线程必须等到有一条消息要获取。
答案 0 :(得分:2)
让我们首先了解这是什么以及他们的工作。
主线程(UI线程): - 在Android应用程序中,MainThread或UI线程应始终仅用于UI操作。 UI操作就像(UI渲染,UI更新,UI事件监听,UI上的用户操作,如滚动,UI动画等)。
如果您的主线程正在执行任何阻止操作,例如(在DB中插入数据,从DB读取数据或任何其他阻塞操作,这需要花费大量时间完成,请举例20秒)和
案例1: - 同时用户尝试在UI上执行某些操作,例如单击按钮或尝试滚动列表,但您的主线程无法响应用户操作,因为他正忙着你的其他未完成的操作。因此,在这种情况下,android等待5秒,如果主线程仍未响应,则显示ANR(Android无响应对话)。
案例2:即使用户没有同时执行任何操作,并且主线程忙碌超过10秒,Android也会显示相同的ANR对话。
后台线程: - 后台线程或工作线程由android应用程序启动,以执行一些繁重的CPU密集型工作,以保持我们的主线程免费用于UI相关工作。
现在回答你的问题,你怀疑主线程处于等待状态以获得新消息或任何事件,所以它是如何' nonblocking '当它在' 等待'州? 等待状态并不意味着他在等待状态下被阻止特定事件主线程实际上是免费的,此时任何人都可以打电话给他并分配工作。所以等待状态不是阻塞状态,而是非阻塞状态。
答案 1 :(得分:1)
引用“我怎么能理解”非阻塞“?在我看来,如果消息队列没有消息发送到消费者线程(可能是UI线程),那么消费者线程必须等到有一条消息要获取。 “
您的误解是,您认为消费者线程的唯一目的是等待生产者线程。在这种情况下,它将是“阻止”
然而,意识到消费者可以是一个完成其工作的服务,并且活动可以随时与其交谈以改变其工作。因此,服务永远不会被活动阻止,它只能接收消息并继续前进。