Android進(jìn)階之光——多線程編程(待完善)

多線程編程

在Android中系統(tǒng)要求網(wǎng)絡(luò)訪問必須在子線程中進(jìn)行庄呈,否則會拋出異常遇伞,避免主線程被耗時操作阻塞而產(chǎn)生ANR

線程基礎(chǔ)

進(jìn)程與線程

什么是進(jìn)程

進(jìn)程是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)块饺,是程序在一個數(shù)據(jù)集合上運(yùn)行的過程,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位昔案。

什么是線程

線程是操作系統(tǒng)調(diào)度的最小單元帝牡,也叫做輕量級進(jìn)程,在一個進(jìn)程中可以創(chuàng)建多個線程堕扶,這些線程都擁有各自的計數(shù)器碍脏、堆棧和局部變量等屬性,并且能夠訪問共享的內(nèi)存變量

線程的狀態(tài)

Java線程在運(yùn)行的生命周期中會有6種狀態(tài)

  • New:新創(chuàng)建狀態(tài)稍算。還沒有調(diào)用start()方法
  • Runnable:可運(yùn)行狀態(tài)典尾。一旦調(diào)用start方法,線程就處于Runnable狀態(tài)糊探,一個可運(yùn)行的線程可能正在運(yùn)行也可能沒有運(yùn)行钾埂。取決于操作系統(tǒng)給線程提供的運(yùn)行時間
  • Blocked:阻塞狀態(tài),表示線程被鎖阻塞
  • Waiting:等待狀態(tài)科平。表示線程暫時不活動
  • Tiimed waiting:超時等待狀態(tài)
  • Terminated:終止?fàn)顟B(tài)褥紫。表示當(dāng)前線程已經(jīng)執(zhí)行完畢。


    線程的狀態(tài)

線程狀態(tài)切換過程:
線程創(chuàng)建后瞪慧,調(diào)用Thread的start方法髓考,開始進(jìn)入運(yùn)行狀態(tài),當(dāng)線程執(zhí)行wait方法后弃酌,線程進(jìn)入等待狀態(tài)氨菇,進(jìn)入等待狀態(tài)的線程需要其他線程通知才能返回運(yùn)行狀態(tài)。超時等待相當(dāng)于在等待狀態(tài)加上了時間限制妓湘,如果超過時間限制查蓉,則線程返回運(yùn)行狀態(tài)。

創(chuàng)建線程

繼承Thread類榜贴,重寫run()方法

實現(xiàn)Runnable接口豌研,實現(xiàn)該接口的run()方法

實現(xiàn)Callable接口,重寫call()方法

Volatile

Volatile關(guān)鍵字為實例域的同步訪問提供了免鎖的機(jī)制。如果聲明一個域為volatile鹃共,那么編譯器和虛擬機(jī)就知道該域是可能被另一個線程并發(fā)更新的鬼佣。

Java內(nèi)存模型

Java中的堆內(nèi)存用來存儲對象實例,堆內(nèi)存是被所有線程共享的運(yùn)行時內(nèi)存區(qū)域及汉,因此堆內(nèi)存存在內(nèi)存可見性的問題沮趣。而局部變量、方法定義的參數(shù)則不會在線程之間共享坷随,不會存在內(nèi)存可見性問題房铭,也不受內(nèi)存模型的影響。
在Java中內(nèi)存模型定義了線程和主存之間的抽象關(guān)系:線程之間的共享變量存儲在主存中温眉,每個線程都有一個私有的本地內(nèi)存缸匪,本地內(nèi)存中存儲了該線程共享變量的副本。


Java內(nèi)存模型的抽象示意圖

線程A與B之間若要通信类溢,要經(jīng)歷以下幾個步驟:

  1. 線程A把線程A本地內(nèi)存中更新過的共享變量刷新到主內(nèi)存中去
  2. 線程B到主存中去讀取線程A之前已更新過的共享變量

Volatile關(guān)鍵字

當(dāng)一個共享變量被Volatile修飾之后凌蔬,就具備了兩個含義,

  • 一個是線程修改了變量的值時闯冷,變量的新值對其他線程是立即可見的
  • 禁止使用指令重排序砂心,指令重排序是指編譯器或運(yùn)行時環(huán)境為了優(yōu)化程序性能而采取的對指令進(jìn)行重新排序的一種手段

volatile保證了操作的可見性、有序性蛇耀,不保證原子性

線程池

線程池的處理流程

線程池的種類

  1. FixedThreadPool
    FixedThreadPool是可重用固定線程數(shù)的線程池
  2. CachedThreadPool
    CachedThreadPool是一個根據(jù)需要創(chuàng)建線程的線程池
  3. SingleThreadExecutor
    SingleThreadExecutor是使用單個工作線程的線程池
    4.ScheduledThreadPool
    ScheduledThreadPool是一個能實現(xiàn)定時和周期性任務(wù)的線程池
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末辩诞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子纺涤,更是在濱河造成了極大的恐慌译暂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩炊,死亡現(xiàn)場離奇詭異外永,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拧咳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門伯顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人骆膝,你說我怎么就攤上這事砾淌。” “怎么了谭网?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赃春。 經(jīng)常有香客問我愉择,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任锥涕,我火速辦了婚禮衷戈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘层坠。我一直安慰自己殖妇,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布破花。 她就那樣靜靜地躺著谦趣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪座每。 梳的紋絲不亂的頭發(fā)上前鹅,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天,我揣著相機(jī)與錄音峭梳,去河邊找鬼舰绘。 笑死,一個胖子當(dāng)著我的面吹牛葱椭,可吹牛的內(nèi)容都是我干的捂寿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼孵运,長吁一口氣:“原來是場噩夢啊……” “哼秦陋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起掐松,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤踱侣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后大磺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抡句,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年杠愧,在試婚紗的時候發(fā)現(xiàn)自己被綠了待榔。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡流济,死狀恐怖锐锣,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绳瘟,我是刑警寧澤雕憔,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站糖声,受9級特大地震影響斤彼,放射性物質(zhì)發(fā)生泄漏分瘦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一琉苇、第九天 我趴在偏房一處隱蔽的房頂上張望嘲玫。 院中可真熱鬧,春花似錦并扇、人聲如沸去团。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽土陪。三九已至,卻和暖如春俩莽,著一層夾襖步出監(jiān)牢的瞬間旺坠,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工扮超, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留取刃,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓出刷,卻偏偏與公主長得像璧疗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子馁龟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 前言 1. 基本介紹 在我學(xué)習(xí) Android 多線程優(yōu)化方法的過程中崩侠,發(fā)現(xiàn)我對多線程優(yōu)化的了解太片面饥努。 寫這篇文...
    燈不利多閱讀 1,866評論 5 6
  • 第5章 多線程編程 5.1 線程基礎(chǔ) 5.1.1 如何創(chuàng)建線程 在java要創(chuàng)建線程筒饰,一般有==兩種方式==:1)...
    AndroidMaster閱讀 1,793評論 0 11
  • 第三章 Java內(nèi)存模型 3.1 Java內(nèi)存模型的基礎(chǔ) 通信在共享內(nèi)存的模型里醒串,通過寫-讀內(nèi)存中的公共狀態(tài)進(jìn)行隱...
    澤毛閱讀 4,352評論 2 22
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月唉锌,有人笑有人哭,有人歡樂有人憂愁秽浇,有人驚喜有人失落召廷,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,536評論 28 53
  • 人工智能是什么揖闸?什么是人工智能句灌?人工智能是未來發(fā)展的必然趨勢嗎夷陋?以后人工智能技術(shù)真的能達(dá)到電影里機(jī)器人的智能水平嗎...
    ZLLZ閱讀 3,778評論 0 5