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

Sol*_*ace 7 multithreading android message message-queue

我刚刚看到了三种方法的文档,当我们在工作线程中工作时,它们可用于在 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 也是一些类,这与那个有关吗?

先感谢您。

Bad*_*ion 5

我认为两者是同义词。使用消息向系统指示事件。

两种方法之间的真正区别在于,一种方法立即将其追加到队列中,而另一种方法则将其延迟指定的量。

编辑:有关消息的更多信息

消息是独立线程之间通信的一种方式。在某种程度上,这很像您在浏览器中打开网站时发生的通信:您向服务器发送一条消息,详细说明您到底想要什么(GET www.stackoverflow.com,我将接受以下内容字符编码,不要跟踪我,blablabla),这使得服务器作为消息的接收者执行某些操作(从数据库检索内容,渲染页面等)并通过消息将结果传达给您。

它的工作原理是这样的:线程Looper上有一个附加的。它所做的就是在连续循环中永远运行,在每次迭代时检查其消息队列中是否有任何消息。如果没有,则进入下一个循环。如果有,它会检索第一条消息来处理它。

然而,循环器本身并不知道任何消息的含义 - 它只是用于循环。线程也不知道,它只是为循环程序提供运行的基础设施。然而,循环程序确实知道去谁那里处理消息:它的其中一个Handler。它将消息传递给处理程序,处理程序现在可以执行处理消息所需的任何操作。


Nik*_*kos 5

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

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

稍后EventManager/MessageManager会将所有这些Events/ Messages 分派给接收对象。不同之处在于,对于MessageQueues,发送者通常需要响应。有了EventQueue这个就没有必要了。

因此,消息管理为消息发送者提供了更多控制权。对于事件队列,发送者所能做的就是将请求放入队列中并希望得到最好的结果。由 a 提供的额外控制MessageQueue会带来一些小的复杂性损失。

选择工作所需的最简单的数据结构。

  • 我喜欢这个定义:“区别在于,对于 MessageQueue,发送者通常需要响应。而对于 EventQueue,则不需要这样做。” (2认同)