国产探花免费观看_亚洲丰满少妇自慰呻吟_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不同所以值互不影響。在多線程的情況,就是靠著這樣的實現保證不同線程中處理的消息互不影響。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 开平市| 河津市| 安图县| 迁安市| 双柏县| 涿鹿县| 民勤县| 龙山县| 通渭县| 瓦房店市| 陆河县| 张北县| 青海省| 玉树县| 通许县| 嘉黎县| 阿克陶县| 沂源县| 鄂托克前旗| 宜黄县| 德钦县| 潮安县| 临夏县| 南投县| 云安县| 芒康县| 天峨县| 池州市| 锡林浩特市| 宁武县| 肇东市| 衢州市| 双辽市| 仙游县| 潮州市| 朔州市| 徐闻县| 托克逊县| 休宁县| 文山县| 西林县|