多線程實現(xiàn)方式及生命周期01

1顺呕、概念

基本概念
進程:就是電腦中一個一個的正在執(zhí)行的應(yīng)用程序枫攀;
線程:負責(zé)執(zhí)行這個程序的執(zhí)行單元;
單線程:效率低株茶,但是安全来涨;
多線程:效率高,但是數(shù)據(jù)不安全启盛;

進程和線程的理解:
操作系統(tǒng)可以同時執(zhí)行多個任務(wù)蹦掐,每個任務(wù)就是進程;進程可以同時執(zhí)行多個任務(wù)僵闯,每個任務(wù)就是線程卧抗。(通常一個任務(wù)就是一個程序,每個運行中的程序就是一個進程鳖粟。一個程序運行時社裆,內(nèi)部可能包含了多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程)

多線程的優(yōu)點:
1.進程之間不能共享內(nèi)存牺弹,但是線程之間共享內(nèi)存非常容易。
2.系統(tǒng)創(chuàng)建進程時需要為該進程重新分配系統(tǒng)資源时呀,但創(chuàng)建線程代價小得多张漂,因此使用多線程來實現(xiàn)多任務(wù)并發(fā)比多進程的效率高。
3.Java語言內(nèi)置了多線程功能支持谨娜,而不是單純地作為底層操作系統(tǒng)的調(diào)度方式航攒,簡化了Java的多線程編程。

2趴梢、多線程實現(xiàn)方式

方式一:
1漠畜、自定義一個繼承Thread類币他,重寫run()方法;
2憔狞、創(chuàng)建Thread子類對象蝴悉,調(diào)用start()方法,開啟線程瘾敢;
使用繼承Thread類的方法創(chuàng)建線程類時拍冠,多個線程之間無法共享線程類的成員變量(子類定義的成員變量)。

方式二:推薦使用
1簇抵、自定義一個類庆杜,實現(xiàn)Runnable接口,重寫run()方法碟摆;
2晃财、創(chuàng)建Thread對象,創(chuàng)建該類對象典蜕, 通過Thread類構(gòu)造方法断盛,把該類對象傳進去;
3嘉裤、調(diào)用Thread類的start()方法開啟線程郑临;
實現(xiàn)Runnable接口的方式,多個線程可以共享同一個線程類的成員變量屑宠。

方式三:使用Callable和Future創(chuàng)建線程

創(chuàng)建線程的三種方式對比(實現(xiàn)接口和繼承Thread類):
實現(xiàn)Runnable或Callable接口創(chuàng)建多線程
優(yōu)點:
1.線程類只是實現(xiàn)了接口厢洞,還可以繼承其他的類;
2.多個線程可以共享同一個target對象典奉,非常適合多個線程來處理同一份資源的情況躺翻,從而可以將CPU、代碼和數(shù)據(jù)分開卫玖,形成清晰地模型公你,較好地體現(xiàn)了面向?qū)ο蟮乃枷耄?br> 缺點:
1.編程稍微復(fù)雜,如果需要訪問當前線程假瞬,則必須使Thread.currentThread()方法陕靠;

繼承Thread類創(chuàng)建多線程:
優(yōu)點:編寫簡單,如果需要訪問當前線程脱茉,直接 使用this可以獲得當前線程剪芥;
缺點:不能再繼承其他父類;

3琴许、線程的生命周期

新建:使用new關(guān)鍵字創(chuàng)建一個線程税肪;
此時,僅僅Java虛擬機為其分配內(nèi)存,并初始化其成員變量的值益兄。

就緒:調(diào)用start()方法后锻梳,線程處于就緒狀態(tài),等待獲取CPU的使用權(quán)净捅。
此時疑枯,具備了執(zhí)行條件,不具備執(zhí)行權(quán)利灸叼。

運行:就緒狀態(tài)的線程得到CPU的使用權(quán)后神汹,進入運行狀態(tài)。
此時古今,具備了執(zhí)行條件屁魏,具備了執(zhí)行權(quán)利。

等待:運行狀態(tài)下的線程捉腥,調(diào)用thread類中的wait()方法氓拼,線程進入等待狀態(tài)。
此時抵碟,必須調(diào)用thread類中的notify()方法才能被喚醒桃漾,喚醒后處于就緒狀態(tài)。

休眠:運行狀態(tài)下的線程拟逮,調(diào)用thread類中的sleep()方法撬统,則會進入休眠狀態(tài)。休眠時間結(jié)束后敦迄,進入就緒狀態(tài)恋追;

阻塞:運行狀態(tài)下的線程,發(fā)出輸入/輸出請求時罚屋,線程進入阻塞狀態(tài)苦囱,等待輸入/輸出結(jié)束時線程進入就緒狀態(tài)。對于阻塞的線程脾猛,即使系統(tǒng)資源空閑撕彤,線程依然不能回到運行狀態(tài)。

死亡:三種情況:
1.當線程的run()方法或call()方法執(zhí)行完畢后猛拴,線程進入死亡狀態(tài)羹铅。
2.線程拋出一個未捕獲的Exception或Error
3.直接調(diào)用該線程的stop()方法來結(jié)束該線程。(該方法容易導(dǎo)致死鎖愉昆,不推薦使用)

Note:不能對一個已經(jīng)死亡的線程調(diào)用start()方法使他重新啟動职员,死亡就是死亡,該線程將不可能再次作為線程執(zhí)行撼唾。對死亡的線程調(diào)用start()方法或?qū)π聞?chuàng)建的線程兩次調(diào)用start()方法廉邑,會引發(fā)IllegalThreadStateException異常;

//當線程在同步代碼塊中倒谷,sleep()和wait()的區(qū)別就很明顯蛛蒙。


clipboard.png

4、同步方法和同步代碼塊

同步方法:(使用同步方法可以非常方便地實現(xiàn)線程安全的類)
用synchronized關(guān)鍵字修飾的方法渤愁,作用是每次只允許一條線程進入方法執(zhí)行代碼牵祟;
靜態(tài)同步方法:本類的字節(jié)碼對象;
非靜態(tài)同步方法:無須顯示指定同步監(jiān)視器抖格,同步方法的監(jiān)視器是this诺苹,也就是調(diào)用該方法的對象。

同步代碼塊:
一個用synchronized關(guān)鍵字修飾的代碼塊雹拄,這個代碼塊中的代碼是被鎖住的代碼收奔,每次只允許一條線程來執(zhí)行;
必須確保同步代碼塊的鎖對象唯一滓玖;//所對象為被訪問的共享資源作為同步監(jiān)視器坪哄。

synchronized(obj){
//此處的代碼就是同步代碼塊
}

其中,obj是同步監(jiān)視器,代碼的含義是:線程開始執(zhí)行同步代碼塊之前势篡,必須先獲得對同步監(jiān)視器的鎖定翩肌。任何時刻只能有一個線程可以獲得對同步監(jiān)視器的鎖定,當同步代碼塊執(zhí)行完成后禁悠,該線程會釋放對該同步監(jiān)視器的鎖定念祭。

同步監(jiān)視器的目的:阻止兩個線程對同一個共享資源進行并發(fā)訪問。因此通常使用可能被并發(fā)訪問的共享資源充當同步監(jiān)視器碍侦。

線程安全的類具有如下特征:
該類的對象可以被多個線程安全地訪問粱坤。
每個線程調(diào)用該對象的任意方法之后都可以得到正確結(jié)果;

可變類和不可變類:
不可變類總是線程安全的祝钢,因為它的對象狀態(tài)不可改變比规,但可變對象需要額外的方法來保證其線程安全。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拦英,一起剝皮案震驚了整個濱河市蜒什,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疤估,老刑警劉巖灾常,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異铃拇,居然都是意外死亡钞瀑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門慷荔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕什,“玉大人,你說我怎么就攤上這事〈叮” “怎么了壹士?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長偿警。 經(jīng)常有香客問我躏救,道長,這世上最難降的妖魔是什么螟蒸? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任盒使,我火速辦了婚禮,結(jié)果婚禮上七嫌,老公的妹妹穿的比我還像新娘少办。我一直安慰自己,他們只是感情好诵原,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布凡泣。 她就那樣靜靜地躺著,像睡著了一般皮假。 火紅的嫁衣襯著肌膚如雪鞋拟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天惹资,我揣著相機與錄音贺纲,去河邊找鬼。 笑死褪测,一個胖子當著我的面吹牛猴誊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播侮措,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼懈叹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了分扎?” 一聲冷哼從身側(cè)響起澄成,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏吓,沒想到半個月后墨状,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡菲饼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年肾砂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宏悦。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡镐确,死狀恐怖包吝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情源葫,我是刑警寧澤漏策,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站臼氨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏芭届。R本人自食惡果不足惜储矩,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褂乍。 院中可真熱鬧持隧,春花似錦、人聲如沸逃片。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褥实。三九已至呀狼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間损离,已是汗流浹背哥艇。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留僻澎,地道東北人貌踏。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像窟勃,于是被迫代替她去往敵國和親祖乳。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

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

  • 進程和線程 進程 所有運行中的任務(wù)通常對應(yīng)一個進程,當一個程序進入內(nèi)存運行時,即變成一個進程.進程是處于運行過程中...
    勝浩_ae28閱讀 5,091評論 0 23
  • 進程和線程 進程 所有運行中的任務(wù)通常對應(yīng)一個進程,當一個程序進入內(nèi)存運行時,即變成一個進程.進程是處于運行過程中...
    小徐andorid閱讀 2,801評論 3 53
  • ??一個任務(wù)通常就是一個程序秉氧,每個運行中的程序就是一個進程眷昆。當一個程序運行時,內(nèi)部可能包含了多個順序執(zhí)行流汁咏,每個順...
    OmaiMoon閱讀 1,664評論 0 12
  • Java多線程學(xué)習(xí) [-] 一擴展javalangThread類 二實現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 2,952評論 1 18
  • 本文主要講了java中多線程的使用方法隙赁、線程同步、線程數(shù)據(jù)傳遞梆暖、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法伞访、概述等。 首先講...
    李欣陽閱讀 2,444評論 1 15