[Android學習筆記]Android中多線程開發的一些概念

來源:互聯網
上載者:User

標籤:android   style   java   使用   strong   資料   

安全執行緒:

在多線程的情況下,不會因為線程之間的操作而導致資料錯誤。

 

線程同步:

同一個資源,可能在同一時間被多個線程操作,這樣會導致資料錯誤。這是一個現象,也是一個問題,而研究如何解決
此類問題的相關工作就叫做線程同步。

 

android中,處理線程同步的手段就是:鎖

一般分為公平鎖和非公平鎖:

synchronized(內部鎖,互斥鎖):
synchronized是JVM提供的線程同步機制,如果出現問題,JVM能捕獲異常,並釋放資源,具體實現機制需要查看JVM源碼

synchronized的使用特點:


lock介面:
這些實現了lock介面的鎖定義是通過java語言進行實現與封裝的,具體的實現機制可以通過查看其原始碼得知

lock執行個體加鎖和解鎖的大概過程:
當一個資源被鎖定之後,訪問它的線程會被加入等待隊列,當

內部鎖(互斥鎖)ReentrantLock
讀寫鎖


synchronized
1.synchronized作用在方法上:鎖對象
2.synchronized作用在代碼塊:只鎖代碼塊
3.synchronized(this):對象鎖
4.synchronized(object):成員鎖

總結synchronized:
可以鎖對象:synchronized(this) , synchronized(class) , synchronized methods , 此時對象的所有
資源不能被其他線程訪問

成員鎖:
synchronized(obj){ } , 程式碼片段內的代碼不能被同時訪問。

對象鎖太粗糙

通常情況使用synchronized就夠了,資源競爭很激烈的情況下,Synchronized的效能會下降幾十倍,才會使用
ReetrantLock來完成複雜的業務需求。(不公平鎖)

 

使用java封裝的鎖對象可以更靈活的滿足業務需求,比如可以設定鎖的等待時間,公平性等等,而使用Synchronized
則只能使用同步監視器的三個方法來操作線程

 

線程通訊:

synchronized作為對象鎖時候,通過this,可以調用三個方法線上程之間通訊
synchronized作為成員所時候,通過(obj),調用三個方法,其中被鎖的東西就叫做同步監視器。(this,obj)

wait:當前線程進入等待狀態,直到其他線程調用該同步監視器的notity方法或者notityall方法來喚醒.
調用wait就以為著釋放同步監視器

notify:喚醒在此同步監視器上等待的單個線程。如果所有線程都在此同步監視器上等待,則會隨機播放喚醒其中一個線程。
只有當前線程放棄對該同步監視器的鎖定後(用wait方法),才可以執行被喚醒的線程

notityAll: 喚醒在此同步監視器上等待的所有線程。只有當前線程放棄對該同步監視器的鎖定後,才能執行喚醒的線程。

 

 

執行緒模式:
訊息迴圈
訊息佇列
handler
Thread
UI Thread

android的執行緒模式:
UI線程有一個訊息佇列,一個訊息迴圈,一個Handler.

一般建立的後台線程對象就是一個一次性完成工作的任務.

如何建立他們之間的聯絡?

一般情況下,啟動一個非UI線程用於處理耗時工作之後,需要一個機制用於通知UI線程,工作做好了,
這個機制就是一個Message。
當後台線程工作結束之後,向欲通知的線程發送一個Message,用來通知這個目標線程說:“我已經工作完了”,而這個
Message怎麼發過去呢?通過Handler對象。 想給哪個線程發送Message就給該線程的Handler發送Message.
(前提是目標線程有處理訊息的能力)
綜上:

當後台線程完成工作之後,會通過UI線程的Handler對象發送一個Message到UI線程的訊息佇列中,UI線程的訊息迴圈
就會從訊息佇列中取出此Message,並且處理此Message,做愛做的事。

 

對於一個後台線程:

 

如果想讓該 線程具有訊息佇列和訊息迴圈,需要線上程中首先調用Looper.prepare()來建立訊息佇列,然後調用Looper.loop()進入訊息迴圈。 如下例所示:
class LooperThread extends Thread {
public Handler mHandler;

 

public void run() {
Looper.prepare();

 

mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};

 

Looper.loop();
}
}
這樣你的線程就具有了訊息處理機制了,在Handler中進行訊息處理。

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.