Android多線程:基礎(chǔ)介紹

每次學(xué)到的東西和運(yùn)用的知識(shí)總是片面性的坟乾,沒(méi)有一個(gè)很好的沉淀档桃,近段時(shí)間有了空閑時(shí)間枪孩,所以對(duì)自身學(xué)到的點(diǎn),進(jìn)行一個(gè)簡(jiǎn)單的記錄:

一藻肄、線程

1蔑舞、定義

線程:程序中單獨(dú)順序的控制流,線程本身依靠程序進(jìn)行運(yùn)行嘹屯,只能使用分配給程序的資源和環(huán)境攻询。

2、作用

減少程序在并發(fā)執(zhí)行時(shí)所付出的時(shí)空開(kāi)銷(xiāo)州弟,提高操作系統(tǒng)的并發(fā)性能钧栖。

3、實(shí)現(xiàn)

繼承Thread類(lèi)

public class MyThread extends Thread {
    @Override
    public void run() {
        super.run();
    }
}

實(shí)現(xiàn)Runnable接口

public class MyRunnable implements Runnable {
    @Override
    public void run() {
    }
}

4婆翔、狀態(tài)

——?jiǎng)?chuàng)建狀態(tài):new 一個(gè)新線程對(duì)象
——就緒狀態(tài):調(diào)用start()方法拯杠,等待cpu進(jìn)行調(diào)度
——運(yùn)行狀態(tài):執(zhí)行run()方法
——阻塞狀態(tài):sleep()/wait()暫時(shí)停止執(zhí)行狀態(tài),可能把資源交給其他線程使用
——終止?fàn)顟B(tài):線程銷(xiāo)毀


示意圖.png

5啃奴、線程屬性

5.1潭陪、線程優(yōu)先級(jí)

在Java程序設(shè)計(jì)語(yǔ)言中,每個(gè)線程都有一個(gè)優(yōu)先級(jí)。默認(rèn)情況下依溯,一個(gè)線程繼承他的父線程的優(yōu)先級(jí)老厌。使用setPriority(int newPriority)方法提高或者降低任何一個(gè)線程的優(yōu)先級(jí)。

表示
// 譬如:
Thread.MIN_PRIORITY // 優(yōu)先級(jí)1
Thread.NORM_PRIORITY // 默認(rèn)優(yōu)先級(jí)5
Thread.MAX_PRIORITY // 優(yōu)先級(jí)10

注意:提高搶到cpu資源的可能性黎炉,但并不是一定能搶到cpu資源枝秤。

5.2、守護(hù)線程

定義:守護(hù)用戶線程的線程慷嗜,即在程序運(yùn)行時(shí)為其他線程提供一種通用服務(wù)
常見(jiàn):如垃圾回收線程
設(shè)置
//標(biāo)識(shí)該線程為守護(hù)線程或用戶線程淀弹。這一方法必須在線程啟動(dòng)之前調(diào)用。
setDaemon(boolean isDaemon)

5.3洪添、非守護(hù)線程(用戶線程)

主要包括:主線程&子線程

a. 主線程(UI線程)

定義:Android系統(tǒng)在程序啟動(dòng)時(shí)會(huì)自動(dòng)啟動(dòng)一條主線程
作用:處理四大組件與用戶進(jìn)行交互的事情(如UI垦页、界面交互相關(guān))
注:因?yàn)橛脩綦S時(shí)會(huì)與界面發(fā)生交互,因此主線程任何時(shí)候都必須保持很高的響應(yīng)速度干奢,所以主線程不允許進(jìn)行耗時(shí)操作痊焊,否則會(huì)出現(xiàn)ANR

b. 子線程(工作線程)

定義:手動(dòng)創(chuàng)建的線程
作用:耗時(shí)的操作(網(wǎng)絡(luò)請(qǐng)求、I/O操作等)

5.4 守護(hù)線程 與 非守護(hù)線程的區(qū)別

區(qū)別:虛擬機(jī)是否已退出:
當(dāng)所有用戶線程結(jié)束時(shí)忿峻,因?yàn)闆](méi)有守護(hù)的必要薄啥,所以守護(hù)線程也會(huì)終止,虛擬機(jī)也同樣退出
反過(guò)來(lái)逛尚,只要任何用戶線程還在運(yùn)行垄惧,守護(hù)線程就不會(huì)終止,虛擬機(jī)就不會(huì)退出

6绰寞、線程中的方法

sleep()和wait()
區(qū)別:
Java中的多線程是一種搶占式的機(jī)制 而不是分時(shí)機(jī)制到逊。搶占式機(jī)制指的是有多個(gè)線程處于可運(yùn)行狀態(tài),但是只有一個(gè)線程在運(yùn)行滤钱。
共同點(diǎn):
(1)觉壶、它們都是在多線程的環(huán)境下,都可以在程序的調(diào)用處阻塞指定的毫秒數(shù)件缸,并返回铜靶。
(2)、wait()和sleep()都可以通過(guò)interrupt()方法 打斷線程的暫停狀態(tài) 他炊,從而使線程立刻拋出InterruptedException争剿。
如果線程A希望立即結(jié)束線程B,則可以對(duì)線程B對(duì)應(yīng)的Thread實(shí)例調(diào)用interrupt方法痊末。如果此刻線程B正在wait/sleep /join蚕苇,則線程B會(huì)立刻拋出InterruptedException,在catch() {} 中直接return即可安全地結(jié)束線程凿叠。
需要注意的是涩笤,InterruptedException是線程自己從內(nèi)部拋出的,并不是interrupt()方法拋出的。對(duì)某一線程調(diào)用 interrupt()時(shí)辆它,如果該線程正在執(zhí)行普通的代碼,那么該線程根本就不會(huì)拋出InterruptedException履恩。但是锰茉,一旦該線程進(jìn)入到 wait()/sleep()/join()后,就會(huì)立刻拋出InterruptedException 切心。

不同點(diǎn):
(1)飒筑、Thread類(lèi)的方法:sleep(),yield()等
Object的方法:wait()和notify()等
(2)、每個(gè)對(duì)象都有一個(gè)鎖來(lái)控制同步訪問(wèn)绽昏。Synchronized關(guān)鍵字可以和對(duì)象的鎖交互协屡,來(lái)實(shí)現(xiàn)線程的同步。
sleep方法沒(méi)有釋放鎖全谤,而wait方法釋放了鎖肤晓,使得其他線程可以使用同步控制塊或者方法。
(3)认然、wait补憾,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
(4)卷员、sleep必須捕獲異常盈匾,而wait,notify和notifyAll不需要捕獲異常

二毕骡、多線程

1削饵、定義

多個(gè)線程同時(shí)進(jìn)行任務(wù)的執(zhí)行,目的為了更好的使用CPU資源未巫。

其實(shí)窿撬,計(jì)算機(jī)任何特定時(shí)刻只能執(zhí)行一個(gè)任務(wù);
多線程只是一種錯(cuò)覺(jué):只是因?yàn)镴VM快速調(diào)度資源來(lái)輪換線程橱赠,使得線程不斷輪流執(zhí)行尤仍,所以看起來(lái)好像在同時(shí)執(zhí)行多個(gè)任務(wù)而已

2、作用

用來(lái)解決以下兩種情況:
1狭姨、不阻塞UI線程:不在主線程中進(jìn)行耗時(shí)操作宰啦。
2、不在非UI線程中更新UI組件饼拍。

3赡模、使用場(chǎng)景

1、將耗時(shí)操作放在工作線程中進(jìn)行师抄。
2漓柑、將UI更新操作放在UI線程中進(jìn)行。

4、實(shí)現(xiàn)方式

1辆布、基礎(chǔ)使用:

繼承Thread
實(shí)現(xiàn)Runnable接口
Handler

2瞬矩、復(fù)合使用

1、AsyncTask
2锋玲、HandlerThread
3景用、IntentService

3、高級(jí)使用

1惭蹂、線程池 ThreadPool

5伞插、同步與死鎖

在大多數(shù)實(shí)際的多線程應(yīng)用中,兩個(gè)或者兩個(gè)以上的線程需要共享對(duì)同一數(shù)據(jù)的存取盾碗,這種操作屬于線程同步媚污。
同步方法:用synchronized關(guān)鍵字進(jìn)行修飾。

    public synchronized void wAndroid(){
         }

死鎖:死鎖就是兩個(gè)或者兩個(gè)以上的線程阻塞著廷雅,并且在等待其他死鎖線程持有的鎖耗美。

三、進(jìn)程

每一個(gè)應(yīng)用程序啟動(dòng)時(shí)對(duì)應(yīng)一個(gè)進(jìn)程榜轿,一個(gè)進(jìn)程包含一個(gè)或多個(gè)線程幽歼,一個(gè)進(jìn)程至少包含一個(gè)線程。

四谬盐、總結(jié)

此篇文章中甸私,對(duì)線程的基礎(chǔ)知識(shí)進(jìn)行了一個(gè)自我認(rèn)知的一個(gè)統(tǒng)計(jì),也是對(duì)自身的一個(gè)理解的記錄飞傀,后期會(huì)一直進(jìn)行完善皇型。如果哪里理解的不對(duì),歡迎指出砸烦。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弃鸦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子幢痘,更是在濱河造成了極大的恐慌唬格,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颜说,死亡現(xiàn)場(chǎng)離奇詭異购岗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)门粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)喊积,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人玄妈,你說(shuō)我怎么就攤上這事乾吻∷杳罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵绎签,是天一觀的道長(zhǎng)枯饿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)诡必,這世上最難降的妖魔是什么鸭你? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮擒权,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阁谆。我一直安慰自己碳抄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布场绿。 她就那樣靜靜地躺著剖效,像睡著了一般。 火紅的嫁衣襯著肌膚如雪焰盗。 梳的紋絲不亂的頭發(fā)上璧尸,一...
    開(kāi)封第一講書(shū)人閱讀 49,111評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音熬拒,去河邊找鬼爷光。 笑死,一個(gè)胖子當(dāng)著我的面吹牛澎粟,可吹牛的內(nèi)容都是我干的蛀序。 我是一名探鬼主播,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼活烙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼徐裸!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起啸盏,我...
    開(kāi)封第一講書(shū)人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤重贺,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后回懦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體气笙,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年粉怕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了健民。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡贫贝,死狀恐怖秉犹,靈堂內(nèi)的尸體忽然破棺而出蛉谜,到底是詐尸還是另有隱情,我是刑警寧澤崇堵,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布型诚,位于F島的核電站,受9級(jí)特大地震影響鸳劳,放射性物質(zhì)發(fā)生泄漏狰贯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一赏廓、第九天 我趴在偏房一處隱蔽的房頂上張望涵紊。 院中可真熱鬧,春花似錦幔摸、人聲如沸摸柄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)驱负。三九已至,卻和暖如春患雇,著一層夾襖步出監(jiān)牢的瞬間跃脊,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工苛吱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留酪术,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓翠储,卻偏偏與公主長(zhǎng)得像拼缝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子彰亥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

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

  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類(lèi) 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評(píng)論 1 18
  • 本文主要講了java中多線程的使用方法咧七、線程同步、線程數(shù)據(jù)傳遞任斋、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法继阻、概述等。 首先講...
    李欣陽(yáng)閱讀 2,442評(píng)論 1 15
  • 林炳文Evankaka原創(chuàng)作品废酷。轉(zhuǎn)載自http://blog.csdn.net/evankaka 本文主要講了ja...
    ccq_inori閱讀 645評(píng)論 0 4
  • 一擴(kuò)展javalangThread類(lèi)二實(shí)現(xiàn)javalangRunnable接口三Thread和Runnable的區(qū)...
    和帥_db6a閱讀 485評(píng)論 0 1
  • 前言:雖然自己平時(shí)都在用多線程瘟檩,也能完成基本的工作需求,但總覺(jué)得澈蟆,還是對(duì)線程沒(méi)有一個(gè)系統(tǒng)的概念墨辛,所以,查閱了一些資...
    justCode_閱讀 700評(píng)論 0 9