菜鳥來解釋執行緒中的迴圈者Looper讀取訊息佇列

2021-06-28 07:25:17 字數 1302 閱讀 8988

安卓中的looper使用就是用來給執行緒建立乙個迴圈,類似while或for迴圈等。

public class looperdemo extends activity 

});} protected void startthread() }};

systemclock.sleep(1000);

log.i(tag, "執行緒啟動");

looper.loop();

}}).start();

; }}

上面的執行結果就是

執行緒啟動

i am from main thread : 1

i am from main thread : 2

i am from main thread : 3

public static prepare();

public static mylooper();

public static loop();

public void quit();

在每個執行緒的run()方法中的最開始呼叫looper.prepare(),這是為執行緒初始化訊息佇列;

呼叫looper.mylooper()獲取此looper物件的引用。這不是必須的,但是prepare()之後才能做相關的操作;

在run()方法中新增handler來處理訊息;

新增looper.loop()呼叫,這是讓執行緒的訊息佇列開始執行,可以接收訊息了。

呼叫looper.quit()退出訊息迴圈;

需要注意的是當乙個執行緒的訊息迴圈已經退出後,不能再給其傳送訊息,否則會有異常丟擲"runtimeexception: handler sending message to a handler on a dead thread"。所以,建議在looper.prepare()後,呼叫looper.mylooper()來獲取對此looper的引用,一來是用於終止(quit()必須在物件上面呼叫); 另外就是用於接收訊息時檢查訊息迴圈是否已經退出(如上例)。傳送訊息的時候也要進行判斷迴圈體是否已經退出,否則也會報錯異常說沒有handler處理訊息。

說一下用法:

1當子執行緒需要接收ui的資料再進行相關處理的時候可以looper來進行接收訊息佇列的訊息;

2當ui執行緒需要一直監聽某些事件,比如按鍵處理等,可以looper,因為程式一啟動就給ui執行緒建立了乙個looper來監聽來自介面或者其他的一些訊息;

3子執行緒之間需要通訊也可以使用looper來監聽訊息佇列的訊息,因為訊息佇列可以是某一線程放入的訊息;

初步了解looper的用法,暫時記錄,留以後增加修改;

執行緒中的生產者消費者問題

這是乙個執行緒同步問題,生產者消費者共享乙個資源,並且生產者消費者之間相互依賴,互為條件 對於生產者,沒有生產產品之前,需通知消費者等待,而生產產品之後需要馬上通知消費者消費 對於消費者,在消費之後,需要通知生產者已經結束消費,需要生產新的產品提供消費 在生產者消費者問題中,僅有synchroniz...

多執行緒中的生產者消費者問題

但是很多時候執行緒之間僅僅同步是不夠的,還需要不同執行緒之間的訊息傳遞通訊,因此,提出了生產者消費者問題。問題的提出 對於生產者,在生產產品之前需要通知消費者等待,當生產完需要通知消費者消費。對於消費者,在消費完以後需要通知生產者生產產品,當產品為空時需要等待。當我們把生產者和消費者當做兩個執行緒來...

多執行緒中的生產者和消費者模式

當乙個程序中存在多個執行緒時,且此時有可能對同一資源進行訪問,那麼此時可能會發生安全問題,因此在訪問之前需要將這些資源放在同步 塊中或同步方法中,通過synchronized關鍵字宣告,此時只能存在乙個執行緒並且該執行緒在獲取到對應的鎖後才能對共享資源操作,完成之後其他執行緒才能獲得該鎖進而操作共享...