2017-08-10 68 views
2

我从书上看到,Android的线程间通信

“最常见的线程通信中使用的情况下,Android是UI线程 和工作线程之间。因此,Android平台定义了自己的消息传递 机制线程之间的通信。UI线程可以通过发送数据消息要在后台线程处理卸载长任务 ,消息传递机制是一个非阻塞消费者 - 生产者模式,其中既不是生产者线程也不消费者线程将在消息切换期间阻塞“。

我怎么能理解“非阻塞”?在我看来,如果messge队列没有​​消息发送到消费者线程(可能是UI线程),那么消费者线程必须等到有一条消息才能获得。

+2

'nonblocking'意味着它不会在消息中阻塞任何线程上的任何执行,因此每个线程仍然可以在不等待的情况下执行。 –

回答

1

让我们先来了解这是什么和他们的工作。

主线程(UI线程): - 在Android应用MainThread或UI线程应始终只用于UI操作。 UI操作类似于(UI渲染,UI更新,UI事件监听,用户对UI的滚动动作,UI动画等操作)

如果您的主线程正在执行任何阻塞操作(如在数据块中插入数据, DB或需要大量的时间,完成举个例子20秒)和

案例1中的任何其他阻塞操作: -同时用户尝试在UI像点击按钮来执行一些动作或尝试滚动列表,但您的主线程无法响应用户操作,因为他忙于您未完成的其他操作。所以在这种情况下,android等待5秒钟,如果主线程仍然没有响应,然后显示ANR(Android没有响应对话)。

案例2: -即使用户没有在同一时间执行任何操作,并且让主线程忙于超过10秒,Android也显示相同的ANR对话框。

后台线程: -后台线程或工作者线程是由Android应用程序开始做一些繁重的CPU密集型工作,以使我们的主线程免费为用户界面的相关工作。

现在来看看你的问题,你有疑问的主线程处于等待状态,以获得新的信息或任何事件,所以它是如何“非阻塞”当它在“等待”状态? 等待状态并不意味着他在等待状态下的特定事件被阻止主线程实际上是空闲的,此时任何人都可以呼叫他并分配工作。所以等待状态不是阻塞状态,而是非阻塞状态。

+0

谢谢!有时我对“等待状态”和“阻塞状态”感到困惑,你的回答非常有帮助! –

1

报价“我怎么能理解了‘非阻塞’?在我看来,如果的messge队列中没有消息要发送给消费者线程(也许UI线程),然后消费者线程必须等待,直到有一个消息让“。

您的误解在于,您认为消费者线程唯一的目的是等待生产者线程。在这种情况下,它会“封锁”,然而,它意识到消费者可能是一个服务的工作,并且活动可以随时与它交谈来改变其工作。因此,该服务永远不会被活动所阻止,它只是能够接收消息并继续前进。