事件队列和消息队列的区别

11
我刚刚查看了三种方法的文档,这些方法可以在工作线程中执行代码时用于在UI线程中执行代码。这三种方法分别是:
  1. public final void runOnUIThread(Runnable action) - 在UI线程上运行指定的操作。如果当前线程是UI线程,则立即执行该操作。如果当前线程不是UI线程,则将该操作发布到UI线程的事件队列中。

  2. public boolean post(Runnable action) - 导致Runnable被添加到消息队列中。该runnable将在用户界面线程上运行。

  3. public boolean postDelayed(Runnable action, long delayMillis) - 导致Runnable被添加到消息队列中,在指定的时间间隔后运行。该runnable将在用户界面线程上运行。

第一个将Runnable发布到UI线程的事件队列中,而另外两个则将Runnable添加到消息队列中。请告诉我它们之间的区别?
我的网络搜索告诉我,事件队列只是等待线程执行的事件队列。我不太清楚消息队列。MessageQueue也是一些类,这是否与此相关?
提前感谢您。
4个回答

5
我认为两者是同义词。使用消息向系统指示事件。
真正的区别在于,一种方法会立即将其附加到队列中,而另一种方法则按指定的时间延迟它。
编辑:更多关于消息的内容
消息是独立线程之间通信的一种方式。某种程度上,它很像您在浏览器中打开网站时进行的通信:您发送一条消息到服务器,详细说明您想要什么(GET www.stackoverflow.com,我将接受以下字符编码,不要跟踪我,等等),这使得服务器作为消息的接收者执行某些操作(从数据库检索内容,呈现页面等),并通过一条消息将此结果返回给您。
它的工作原理是这样的:线程附有一个Looper。它只是在连续循环中永远运行,每次迭代都会检查其消息队列中是否有任何消息。如果没有,则进入下一个周期。如果有,则检索第一条消息以处理它。
但是,looper本身不知道任何消息的含义-它只是用于循环。线程也不知道,它只提供了looper运行所需的基础设施。然而,looper确实知道去哪里处理消息:其中之一是它的Handler。它将消息传递给处理程序,后者现在可以去做任何需要处理消息的事情。

哦,这让我思考消息是什么。我正在尝试理解消息、消息队列、处理程序、循环器等是什么,但我还没有完全明白。我是一个初学者。 - Solace
它们是同义词。谢谢。 - Solace
1
我在我的回答中添加了有关消息和处理程序的部分。希望能有所帮助。 - BadIdeaException
这真的非常有用。我感激不尽。 - Solace

5

消息队列和事件队列是非常相似的设计模式,但有一个明显的区别。

首先让我们回顾它们的相似之处。两者都是异步的,并按FIFO顺序存储通知。发送通知会将事件/消息入队并返回。

稍后,EventManager/MessageManager将向接收方对象分派所有这些Event/Message。不同之处在于,使用MessageQueue时,通常发送方需要得到回复。而在EventQueue中,这并不一定。

因此,消息管理可以为消息发送方提供更多控制权。对于事件队列,发送方能做的就是将请求放入队列并希望一切顺利。由MessageQueue提供的额外控制会带来小的复杂性成本。

选择最简单的数据结构来完成工作。


2
我喜欢这个定义:“区别在于使用消息队列时,发送方通常需要响应。而使用事件队列则不必要。” - Huan

1

为了澄清一些事情:UI线程和用户界面线程是同一个线程,事件队列和消息队列是同一个队列。

runOnUIThreadpost的共同点是它们都会导致Runnable在UI线程上执行。

两者之间的区别在于,runOnUIThread在从UI线程调用时立即运行Runnable,而对于post,始终会发布消息,导致它在其他消息之后运行。

“使用哪个”简单的答案是,如果您不知道,请使用post,因为如果runOnUIThread使用Runnable进行调用并出现runOnUIThread(this),将锁定UI线程并导致堆栈溢出。

答案来源:来自this page中的Activity源代码。

public final void runOnUiThread(Runnable action) {
  if (Thread.currentThread() != mUiThread) {
    mHandler.post(action);
  } else {
    action.run();
  }
}

0

正如其他人已经指出的那样,在你的情况下,事件队列消息队列相同的。 然而,一般来说,它们有所区别。

它们共享队列(如名称所示):一种按照先进先出顺序放置和获取元素的数据结构。

现在的区别在于,你将消息还是事件放入该队列中。

消息和事件之间的区别是什么?

一条消息:

  • 有一个明确的可寻址的接收者
  • 通常带有让接收者知道或让其执行某事的意图("做 xyz!")
  • 可以是同步或异步的

一个事件:

  • 没有接收者,只是放在某个地方(其他人可以听到并可能作出反应)
  • 是一个纯粹的陈述,表示某事发生了,没有通知任何人的意图。制片人不在乎谁听到这些事件,也不需要知道。 ("xyz 发生了。")
  • 始终是异步的(以同步、阻塞的方式等待没有意义,因为从不期望有接收者回答!)

关于消息与事件以及事件驱动架构的更多信息:The Many Meanings of Event-Driven Architecture • Martin Fowler • GOTO Conference 2017 (YouTube)

消息队列和事件队列之间有什么区别?

第三个点与之前所做的消息和事件(同步/异步)之间的区别无法帮助我们。在两个组件之间有一个队列意味着通信是异步的(彼此之间没有等待,它们是解耦的!)。但前两个可以。
如果您的队列中的元素有明确的接收者->它是一个消息队列 如果您的队列中的元素是为了让接收者执行某些操作而发送的->它是一个消息队列 否则->它是一个事件队列
你的队列肯定是一个消息队列。 从前面部分关于消息和事件的定义可以看出。
首先,因为这些元素有明确的接收者:UI线程。甚至可以说接收者拥有该队列,正如措辞所透露的那样:
如果当前线程不是UI线程,则将操作发布到UI线程的事件队列中。
其次,这些元素被发送出去的目的是让UI线程执行某些操作-它们实际上是在说“执行这个动作!”
文档编写者在这里可能只是措辞不当。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接