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

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

Handler系列(一)之ThreadLocal

2019-11-09 19:02:03
字體:
供稿:網(wǎng)友

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

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

寫兩個(gè)線程詢問本人的身份。

/** * 我在公司 */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(); }}

現(xiàn)在來打印身份:

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; }}

運(yùn)行看看角色: 這里寫圖片描述

這里寫圖片描述 幾次運(yùn)行結(jié)果不相同,角色亂了,所以需要用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(); } }}

這里寫圖片描述 我們首先創(chuàng)建一個(gè)ThreadLocal的對(duì)象,在每個(gè)場(chǎng)景(線程)中設(shè)置自己的身份。

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

通過源碼我們可以很清晰看到身份設(shè)置時(shí)會(huì)利用場(chǎng)景(即當(dāng)前線程)做Map的Key,這樣就保證了每個(gè)線程對(duì)應(yīng)的Key不同所以值互不影響。在多線程的情況,就是靠著這樣的實(shí)現(xiàn)保證不同線程中處理的消息互不影響。


上一篇:adb shell 小結(jié)

下一篇:11

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 永兴县| 丹寨县| 安化县| 老河口市| 惠州市| 葫芦岛市| 鄂托克前旗| 荔浦县| 北辰区| 汪清县| 龙江县| 金秀| 永康市| 曲靖市| 荥经县| 盐津县| 兴化市| 梁平县| 绥棱县| 长沙县| 仁布县| 东海县| 大冶市| 宣威市| 乌苏市| 扎兰屯市| 姜堰市| 如东县| 乌拉特前旗| 沙洋县| 公主岭市| 临西县| 青铜峡市| 西吉县| 无棣县| 普陀区| 长乐市| 磐石市| 乐亭县| 涿鹿县| 柏乡县|