2017-08-10 67 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線程),然後消費者線程必須等待,直到有一個消息讓「。

您的誤解在於,您認爲消費者線程唯一的目的是等待生產者線程。在這種情況下,它會「封鎖」,然而,它意識到消費者可能是一個服務的工作,並且活動可以隨時與它交談來改變其工作。因此,該服務永遠不會被活動所阻止,它只是能夠接收消息並繼續前進。