国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Handler系列(一)之ThreadLocal

2019-11-09 18:26:43
字體:
來源:轉載
供稿:網友

說明:本系列文章是從《有心課堂》中”谷歌的小弟”之《深入探討Android異步精髓Handler》教程整理。 Handler是Android中對消息的一種處理機制,處理說到底是對數據的處理,特別是在多線程中,我們要保證各個線程中的數據不相互干涉就要用到ThreadLocal類。 ThreadLocal類是不同線程的數據副本。我們可以舉例說明。人都有很多身份,就以我做例子,在公司是職員,回到家是兒子,在女朋友面前是男朋友。下面寫個程序來詢問身份。

PRivate String mString; //身份記錄private String res1, res2, res3; //幾個場景:公司、家、女朋友面前

寫兩個線程詢問本人的身份。

/** * 我在公司 */private class Thread01 extends Thread{ @Override public void run() { setString("我是職員"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res1 = getString(); }}/** * 我在家 */private class Thread02 extends Thread{ @Override public void run() { setString("我是兒子"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res2 = getString(); }}

現在來打印身份:

public class ThreadLocalActivity01 extends Activity{ private String mString; private String res1, res2, res3; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); askWhoAreYou(); } private void askWhoAreYou(){ new Thread01().start(); new Thread02().start(); setString("我是男朋友"); res3 = getString(); try { sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.i("我在公司", res1); Log.i("我在家", res2); Log.i("我在女朋友面前", res3); } public void setString(String string) { mString = string; } public String getString() { return mString; }}

運行看看角色: 這里寫圖片描述

這里寫圖片描述 幾次運行結果不相同,角色亂了,所以需要用ThreadLocal來解決此類問題。

public class ThreadLocalActivity02 extends Activity{ private String res1, res2, res3; private ThreadLocal<String> mThreadLocal = new ThreadLocal<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); askWhoAreYou(); } private void askWhoAreYou(){ new Thread01().start(); new Thread02().start(); mThreadLocal.set("我是男朋友"); res3 = mThreadLocal.get(); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } Log.i("我在公司", res1); Log.i("我在家", res2); Log.i("我在女朋友面前", res3); } private class Thread01 extends Thread{ @Override public void run() { mThreadLocal.set("我是職員"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res1 = mThreadLocal.get(); } } private class Thread02 extends Thread{ @Override public void run() { mThreadLocal.set("我是兒子"); try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } res2 = mThreadLocal.get(); } }}

這里寫圖片描述 我們首先創建一個ThreadLocal的對象,在每個場景(線程)中設置自己的身份。

public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }

通過源碼我們可以很清晰看到身份設置時會利用場景(即當前線程)做Map的Key,這樣就保證了每個線程對應的Key不同所以值互不影響。在多線程的情況,就是靠著這樣的實現保證不同線程中處理的消息互不影響。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 房山区| 汤原县| 安义县| 图木舒克市| 桐柏县| 长泰县| 卢龙县| 安多县| 高碑店市| 德阳市| 化隆| 浮山县| 东宁县| 前郭尔| 长阳| 吉水县| 雅安市| 宜宾市| 清丰县| 东丽区| 潢川县| 寿阳县| 达拉特旗| 莱西市| 永胜县| 北京市| 铁岭市| 上犹县| 伊川县| 松阳县| 郸城县| 盘锦市| 屏东市| 巴林右旗| 镇宁| 武义县| 屏南县| 娄底市| 定陶县| 江达县| 喜德县|