簡體   English   中英

事件隊列和消息隊列的區別

[英]Difference between event queue and 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 也是一些類,這與那個有關嗎?

先感謝您。

我認為兩者是同義詞。 使用消息向系統指示事件。

這兩種方法的真正區別在於,一種方法是立即將其添加到隊列中,而另一種方法則將其延遲指定的數量。

編輯:有關消息的更多信息

消息是獨立線程之間的一種通信方式。 在某種程度上,這很像在瀏覽器中打開網站時發生的通信:您向服務器發送一條消息,詳細說明您想要什么(獲取 www.stackoverflow.com,我將接受以下內容字符編碼,不要跟蹤我,blablabla),這使得作為消息接收者的服務器做一些事情(從數據庫中檢索內容,呈現頁面等)並通過消息將結果傳達給您。

它的工作原理是這樣的:該線程附有一個Looper 它所做的只是在一個連續循環中永遠運行,在每次迭代時檢查其消息隊列中是否有任何消息。 如果沒有,則進入下一個循環。 如果有,它會檢索第一條消息來處理它。

然而,looper 本身並不知道任何消息的含義——它只是用於循環。 線程也沒有,它只是為循環程序提供運行的基礎設施。但是,循環程序確實知道該去找誰來處理消息:它的Handler 它將消息傳遞給處理程序,處理程序現在可以執行任何處理消息所需的操作。

消息隊列和事件隊列是非常相似的設計模式,但有一個顯着區別。

首先讓我們回顧一下相似之處。 兩者都是異步的。 它們以 FIFO 順序存儲通知。 發送通知將事件/消息加入隊列並返回。

稍后EventManager / MessageManager會將所有這些Event s / Message s 分派給接收者對象。 不同之處在於,對於MessageQueue s,發送者通常需要響應。 使用EventQueue這不是必需的。

因此,消息管理為消息的發送者提供了更多的控制權。 有了事件隊列,發送者所能做的就是在隊列中拋出一個請求並希望最好。 MessageQueue提供的額外控制帶來了小的復雜性損失。

選擇工作所需的最簡單的數據結構。

澄清一下:UI 線程和用戶界面線程是同一個線程,事件隊列和消息隊列是同一個隊列。

runOnUIThreadpost之間的runOnUIThread是兩者都會導致Runnable在 UI 線程上執行。

兩者之間的區別在於runOnUIThread在從 UI 線程調用時立即運行Runnable而對於post ,總是發布一條消息,導致它在其他消息之后運行。

簡單的答案為“使用哪一個”將使用post ,如果你不知道,因為如果runOnUIThread是帶一個Runnable ,做runOnUIThread(this) ,將UI線程和鉛鎖定到堆棧溢出。

答案來源:來自本頁中的活動源代碼的代碼:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM