多線(xiàn)程總結(jié)

一、進(jìn)程和線(xiàn)程

進(jìn)程:進(jìn)程是具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),進(jìn)程是系統(tǒng)進(jìn)行資源分配和調(diào)度的一個(gè)獨(dú)立單位.

線(xiàn)程:線(xiàn)程是進(jìn)程的一個(gè)實(shí)體,是CPU調(diào)度和分派的基本單位,它是比進(jìn)程更小的能獨(dú)立運(yùn)行的基本單位.線(xiàn)程自己基本上不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源(如程序計(jì)數(shù)器,一組寄存器和棧),但是它可與同屬一個(gè)進(jìn)程的其他的線(xiàn)程共享進(jìn)程所擁有的全部資源.


特點(diǎn)與區(qū)別:

1白群、簡(jiǎn)而言之,一個(gè)程序至少有一個(gè)進(jìn)程,一個(gè)進(jìn)程至少有一個(gè)線(xiàn)程.

2、線(xiàn)程的劃分尺度小于進(jìn)程妆棒,使得多線(xiàn)程程序的并發(fā)性高。

3沸伏、另外糕珊,進(jìn)程在執(zhí)行過(guò)程中擁有獨(dú)立的內(nèi)存單元,而多個(gè)線(xiàn)程共享內(nèi)存毅糟,從而極大地提高了程序的運(yùn)行效率红选。

4、線(xiàn)程在執(zhí)行過(guò)程中與進(jìn)程還是有區(qū)別的姆另。每個(gè)獨(dú)立的線(xiàn)程有一個(gè)程序運(yùn)行的入口喇肋、順序執(zhí)行序列和程序的出口。但是線(xiàn)程不能夠獨(dú)立執(zhí)行迹辐,必須依存在應(yīng)用程序中蝶防,由應(yīng)用程序提供多個(gè)線(xiàn)程執(zhí)行控制。

5明吩、從邏輯角度來(lái)看间学,多線(xiàn)程的意義在于一個(gè)應(yīng)用程序中,有多個(gè)執(zhí)行部分可以同時(shí)執(zhí)行印荔。但操作系統(tǒng)并沒(méi)有將多個(gè)線(xiàn)程看做多個(gè)獨(dú)立的應(yīng)用低葫,來(lái)實(shí)現(xiàn)進(jìn)程的調(diào)度和管理以及資源分配。這就是進(jìn)程和線(xiàn)程的重要區(qū)別仍律。

二嘿悬、線(xiàn)程的五大基本狀態(tài)及相互轉(zhuǎn)換


線(xiàn)程狀態(tài)轉(zhuǎn)換圖

1.新建狀態(tài)(New):

當(dāng)用new操作符創(chuàng)建一個(gè)線(xiàn)程時(shí), 例如new Thread(r)水泉,線(xiàn)程還沒(méi)有開(kāi)始運(yùn)行善涨,此時(shí)線(xiàn)程處在新建狀態(tài)。 當(dāng)一個(gè)線(xiàn)程處于新生狀態(tài)時(shí)草则,程序還沒(méi)有開(kāi)始運(yùn)行線(xiàn)程中的代碼钢拧。

多線(xiàn)程的實(shí)現(xiàn)方法:a、繼承Thread類(lèi)畔师;b娶靡、實(shí)現(xiàn)Runnable接口

2.就緒狀態(tài)(Runnable)

一個(gè)新創(chuàng)建的線(xiàn)程并不自動(dòng)開(kāi)始運(yùn)行牧牢,要執(zhí)行線(xiàn)程看锉,必須調(diào)用線(xiàn)程的start()方法姿锭。當(dāng)線(xiàn)程對(duì)象調(diào)用start()方法即啟動(dòng)了線(xiàn)程,start()方法創(chuàng)建線(xiàn)程運(yùn)行的系統(tǒng)資源伯铣,并調(diào)度線(xiàn)程運(yùn)行run()方法呻此。當(dāng)start()方法返回后,線(xiàn)程就處于就緒狀態(tài)腔寡。

處于就緒狀態(tài)的線(xiàn)程并不一定立即運(yùn)行run()方法焚鲜,線(xiàn)程還必須同其他線(xiàn)程競(jìng)爭(zhēng)CPU時(shí)間,只有獲得CPU時(shí)間才可以運(yùn)行線(xiàn)程放前。因?yàn)樵趩蜟PU的計(jì)算機(jī)系統(tǒng)中忿磅,不可能同時(shí)運(yùn)行多個(gè)線(xiàn)程,一個(gè)時(shí)刻僅有一個(gè)線(xiàn)程處于運(yùn)行狀態(tài)凭语。因此此時(shí)可能有多個(gè)線(xiàn)程處于就緒狀態(tài)葱她。對(duì)多個(gè)處于就緒狀態(tài)的線(xiàn)程是由Java運(yùn)行時(shí)系統(tǒng)的線(xiàn)程調(diào)度程序(thread scheduler)來(lái)調(diào)度的。

3.運(yùn)行狀態(tài)(Running)

當(dāng)線(xiàn)程獲得CPU時(shí)間后似扔,它才進(jìn)入運(yùn)行狀態(tài)吨些,真正開(kāi)始執(zhí)行run()方法.

4. 阻塞狀態(tài)(Blocked)

線(xiàn)程運(yùn)行過(guò)程中,可能由于各種原因進(jìn)入阻塞狀態(tài):

1>線(xiàn)程通過(guò)調(diào)用sleep方法進(jìn)入睡眠狀態(tài)炒辉;sleep方法必須帶參數(shù)豪墅,sleep后可以用interrupt喚醒

2>線(xiàn)程調(diào)用一個(gè)在I/O上被阻塞的操作,即該操作在輸入輸出操作完成之前不會(huì)返回到它的調(diào)用者黔寇;

3>線(xiàn)程試圖得到一個(gè)鎖偶器,而該鎖正被其他線(xiàn)程持有;

4>線(xiàn)程在等待某個(gè)觸發(fā)條件缝裤;

......

所謂阻塞狀態(tài)是正在運(yùn)行的線(xiàn)程沒(méi)有運(yùn)行結(jié)束状囱,暫時(shí)讓出CPU,這時(shí)其他處于就緒狀態(tài)的線(xiàn)程就可以獲得CPU時(shí)間倘是,進(jìn)入運(yùn)行狀態(tài)亭枷。

join()方法:

當(dāng)A線(xiàn)程執(zhí)行到了B線(xiàn)程的.join()方法時(shí),A就會(huì)等待搀崭。等B線(xiàn)程都執(zhí)行完叨粘,A才會(huì)執(zhí)行。

join可以用來(lái)臨時(shí)加入線(xiàn)程執(zhí)行瘤睹。

1.線(xiàn)程使用join方法升敲,主線(xiàn)程就停下,等它執(zhí)行完轰传,那么如果該線(xiàn)程凍結(jié)了驴党,主線(xiàn)程就掛了,這也是為什么線(xiàn)程要拋異常的原因

2.當(dāng)兩個(gè)或以上線(xiàn)程開(kāi)啟了获茬,這個(gè)A線(xiàn)程才使用join方法港庄,那么主線(xiàn)程還是停下倔既,這幾個(gè)個(gè)線(xiàn)程交替進(jìn)行,直到A執(zhí)行完鹏氧,主線(xiàn)程才復(fù)活

sleep()和wait()方法:

a渤涌、(1)首先,調(diào)用sleep()之后把还,會(huì)引起當(dāng)前執(zhí)行的線(xiàn)程進(jìn)入暫時(shí)中斷狀態(tài)实蓬,也即睡眠狀態(tài)。

(2)其次吊履,雖然當(dāng)前線(xiàn)程進(jìn)入了睡眠狀態(tài)安皱,但是依然持有monitor對(duì)象。

(3)在中斷完成之后艇炎,自動(dòng)進(jìn)入喚醒狀態(tài)從而繼續(xù)執(zhí)行代碼练俐。

b、(1)首先冕臭,調(diào)用了wait()之后會(huì)引起當(dāng)前線(xiàn)程處于等待狀狀態(tài)腺晾。

(2)其次,每個(gè)線(xiàn)程必須持有該對(duì)象的monitor辜贵。如果在當(dāng)前線(xiàn)程中調(diào)用wait()方法之后悯蝉,該線(xiàn)程就會(huì)釋放monitor的持有對(duì)象并讓自己處于等待狀態(tài)。

(3)如果想喚醒一個(gè)正在等待的線(xiàn)程托慨,那么需要開(kāi)啟一個(gè)線(xiàn)程通過(guò)notify()或者notifyAll()方法去通知正在等待的線(xiàn)程獲取monitor對(duì)象鼻由。如此,該線(xiàn)程即可打破等待的狀態(tài)繼續(xù)執(zhí)行代碼厚棵。

5. 死亡狀態(tài)(Dead)

有兩個(gè)原因會(huì)導(dǎo)致線(xiàn)程死亡:

1) run方法正常退出而自然死亡蕉世,

2) 一個(gè)未捕獲的異常終止了run方法而使線(xiàn)程猝死。

為了確定線(xiàn)程在當(dāng)前是否存活著(就是要么是可運(yùn)行的婆硬,要么是被阻塞了)狠轻,需要使用isAlive方法。如果是可運(yùn)行或被阻塞彬犯,這個(gè)方法返回true向楼; 如果線(xiàn)程仍舊是new狀態(tài)且不是可運(yùn)行的, 或者線(xiàn)程死亡了谐区,則返回false.

三湖蜕、線(xiàn)程安全和線(xiàn)程同步

線(xiàn)程安全就是多線(xiàn)程訪(fǎng)問(wèn)時(shí),采用了加鎖機(jī)制宋列,當(dāng)一個(gè)線(xiàn)程訪(fǎng)問(wèn)該類(lèi)的某個(gè)數(shù)據(jù)時(shí)昭抒,進(jìn)行保護(hù),其他線(xiàn)程不能進(jìn)行訪(fǎng)問(wèn)直到該線(xiàn)程讀取完,其他線(xiàn)程才可使用灭返。不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染盗迟。

線(xiàn)程不安全就是不提供數(shù)據(jù)訪(fǎng)問(wèn)保護(hù),有可能出現(xiàn)多個(gè)線(xiàn)程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)是臟數(shù)據(jù)婆殿。

補(bǔ)充:

線(xiàn)程類(lèi)的一些常用方法:

sleep(): 強(qiáng)迫一個(gè)線(xiàn)程睡眠N毫秒。

isAlive(): 判斷一個(gè)線(xiàn)程是否存活罩扇。

join(): 等待線(xiàn)程終止婆芦。

activeCount(): 程序中活躍的線(xiàn)程數(shù)。

enumerate(): 枚舉程序中的線(xiàn)程喂饥。

currentThread(): 得到當(dāng)前線(xiàn)程消约。

isDaemon(): 一個(gè)線(xiàn)程是否為守護(hù)線(xiàn)程。

setDaemon(): 設(shè)置一個(gè)線(xiàn)程為守護(hù)線(xiàn)程员帮。(用戶(hù)線(xiàn)程和守護(hù)線(xiàn)程的區(qū)別在于或粮,是否等待主線(xiàn)程依賴(lài)于主線(xiàn)程結(jié)束而結(jié)束)

setName(): 為線(xiàn)程設(shè)置一個(gè)名稱(chēng)。

wait(): 強(qiáng)迫一個(gè)線(xiàn)程等待捞高。

notify(): 通知一個(gè)線(xiàn)程繼續(xù)運(yùn)行氯材。

setPriority(): 設(shè)置一個(gè)線(xiàn)程的優(yōu)先級(jí)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末硝岗,一起剝皮案震驚了整個(gè)濱河市氢哮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌型檀,老刑警劉巖冗尤,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異胀溺,居然都是意外死亡裂七,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)仓坞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)背零,“玉大人,你說(shuō)我怎么就攤上這事无埃∽叫耍” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵录语,是天一觀(guān)的道長(zhǎng)倍啥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)澎埠,這世上最難降的妖魔是什么虽缕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蒲稳,結(jié)果婚禮上氮趋,老公的妹妹穿的比我還像新娘伍派。我一直安慰自己,他們只是感情好剩胁,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布诉植。 她就那樣靜靜地躺著,像睡著了一般昵观。 火紅的嫁衣襯著肌膚如雪晾腔。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天啊犬,我揣著相機(jī)與錄音灼擂,去河邊找鬼。 笑死觉至,一個(gè)胖子當(dāng)著我的面吹牛剔应,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播语御,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼峻贮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了应闯?” 一聲冷哼從身側(cè)響起月洛,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孽锥,沒(méi)想到半個(gè)月后嚼黔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惜辑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年唬涧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盛撑。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡碎节,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵卫,到底是詐尸還是另有隱情狮荔,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布介粘,位于F島的核電站殖氏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏姻采。R本人自食惡果不足惜雅采,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧婚瓜,春花似錦宝鼓、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至胡陪,卻和暖如春沥寥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背督弓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工营曼, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乒验,地道東北人愚隧。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锻全,于是被迫代替她去往敵國(guó)和親狂塘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • 一鳄厌、認(rèn)識(shí)多任務(wù)荞胡、多進(jìn)程、單線(xiàn)程了嚎、多線(xiàn)程 要認(rèn)識(shí)多線(xiàn)程就要從操作系統(tǒng)的原理說(shuō)起泪漂。 以前古老的DOS操作系統(tǒng)(V 6....
    GT921閱讀 1,011評(píng)論 0 3
  • 又來(lái)到了一個(gè)老生常談的問(wèn)題,應(yīng)用層軟件開(kāi)發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢歪泳? 今天就這個(gè)問(wèn)題開(kāi)始萝勤,來(lái)談?wù)劜?..
    tangsl閱讀 4,088評(píng)論 0 23
  • 什么是進(jìn)程?進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序每個(gè)進(jìn)程之間是獨(dú)立的,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)存空間內(nèi)...
    Mg明明就是你閱讀 1,499評(píng)論 6 24
  • 進(jìn)程 什么是進(jìn)程 進(jìn)程是指在系統(tǒng)中正在運(yùn)行的一個(gè)應(yīng)用程序 每個(gè)進(jìn)程之間是獨(dú)立的呐伞,每個(gè)進(jìn)程均運(yùn)行在其專(zhuān)用且受保護(hù)的內(nèi)...
    45b645c5912e閱讀 466評(píng)論 0 5
  • 悲欣交集的夜晚 到上海的時(shí)候敌卓,天色正黃昏,一個(gè)人下火車(chē)伶氢,找地鐵趟径,找酒店,恍惚中想起為了這只眼睛獨(dú)自走過(guò)的長(zhǎng)沙癣防、武漢...
    明明似我閱讀 450評(píng)論 0 0