無標(biāo)題文章

Java Thread 總結(jié)

【顯示目錄】

?線程的概述(Introduction)

線程是一個(gè)程序的多個(gè)執(zhí)行路徑辑甜,執(zhí)行調(diào)度的單位懈涛,依托于進(jìn)程存在。 線程不僅可以共享進(jìn)程的內(nèi)存,而且還擁有一個(gè)屬于自己的內(nèi)存空間檩赢,這段內(nèi)存空間也叫做線程棧搬卒,是在建立線程時(shí)由系統(tǒng)分配的瑟俭,主要用來保存線程內(nèi)部所使用的數(shù)據(jù),如線程執(zhí)行函數(shù)中所定義的變量契邀。

注意:Java中的多線程是一種搶占機(jī)制而不是分時(shí)機(jī)制摆寄。搶占機(jī)制指的是有多個(gè)線程處于可運(yùn)行狀態(tài),但是只允許一個(gè)線程在運(yùn)行,他們通過競(jìng)爭(zhēng)的方式搶占CPU微饥。

?線程的定義(Defining)

定義一個(gè)線程(Defining a Thread)有兩種方法

1) 繼承java.lang.Thread類

/**

* 使用繼承java.lang.Thread類的方式創(chuàng)建一個(gè)線程

*

*@authorDreamSea 2011-12-29 20:17:06

*/

publicclassThreadTestextendsThread {

/**

* 重寫(Override)run()方法 JVM會(huì)自動(dòng)調(diào)用該方法

*/

publicvoidrun() {

System.out.println("I'm running!");

}

}

注意:重寫(override)run()方法在該線程的start()方法被調(diào)用后逗扒,JVM會(huì)自動(dòng)調(diào)用run方法來執(zhí)行任務(wù);但是重載(overload)run()方法欠橘,該方法和普通的成員方法一樣矩肩,并不會(huì)因調(diào)用該線程的start()方法而被JVM自動(dòng)運(yùn)行。 例如:

publicclassThreadTestextendsThread {

/**

* 重寫(Override)run()方法 JVM會(huì)自動(dòng)調(diào)用該方法

*/

@Override

publicvoidrun() {

System.out.println("I'm running!");

}

/**

* 重載(Overload)run()方法 和普通的方法一樣肃续,并不會(huì)在該線程的start()方法被調(diào)用后被JVM自動(dòng)運(yùn)行

*/

publicvoidrun(inttimes) {

System.out.println("I'm running!(Overload)");

}

}

不建議使用此方法定義線程黍檩,因?yàn)椴捎美^承Thread的方式定義線程后,你不能在繼承其他的類了始锚,導(dǎo)致程序的可擴(kuò)展性大大降低刽酱。

2) 實(shí)現(xiàn)java.lang.Runnable接口

/**

* 通過實(shí)現(xiàn)Runnable接口創(chuàng)建一個(gè)線程

*@authorDreamSea

*/

publicclassThreadTestimplementsRunnable {

publicvoidrun() {

System.out.println("I'm running!");

}

}

?線程的啟動(dòng)(Starting)

任何一個(gè)線程的執(zhí)行的前提都是必須有Thread class的實(shí)例存在,并且通過調(diào)用run()方法啟動(dòng)線程瞧捌。

1)如果線程是繼承Thread類棵里,則創(chuàng)建方式如下:

ThreadTest1 tt =newThreadTest1();

tt.start();

2)如果是實(shí)現(xiàn)Runnable接口,則創(chuàng)建方式如下:

ThreadTest2 tt =newThreadTest2();

Thread t =newThread(tt);

t.start();

?線程的狀態(tài)(State)

新生狀態(tài)(New):當(dāng)一個(gè)線程的實(shí)例被創(chuàng)建即使用new關(guān)鍵字和Thread類或其子類創(chuàng)建一個(gè)線程對(duì)象后姐呐,此時(shí)該線程處于新生(new)狀態(tài)殿怜,處于新生狀態(tài)的線程有自己的內(nèi)存空間,但該線程并沒有運(yùn)行曙砂,此時(shí)線程還不是活著的(not alive)头谜;

就緒狀態(tài)(Runnable):通過調(diào)用線程實(shí)例的start()方法來啟動(dòng)線程使線程進(jìn)入就緒狀態(tài)(runnable);處于就緒狀態(tài)的線程已經(jīng)具備了運(yùn)行條件麦轰,但還沒有被分配到CPU即不一定會(huì)被立即執(zhí)行乔夯,此時(shí)處于線程就緒隊(duì)列,等待系統(tǒng)為其分配CPCU款侵,等待狀態(tài)并不是執(zhí)行狀態(tài)末荐; 此時(shí)線程是活著的(alive);

運(yùn)行狀態(tài)(Running):一旦獲取CPU(被JVM選中)新锈,線程就進(jìn)入運(yùn)行(running)狀態(tài)甲脏,線程的run()方法才開始被執(zhí)行;在運(yùn)行狀態(tài)的線程執(zhí)行自己的run()方法中的操作妹笆,直到調(diào)用其他的方法而終止块请、或者等待某種資源而阻塞、或者完成任務(wù)而死亡拳缠;如果在給定的時(shí)間片內(nèi)沒有執(zhí)行結(jié)束墩新,就會(huì)被系統(tǒng)給換下來回到線程的等待狀態(tài);此時(shí)線程是活著的(alive)窟坐;

阻塞狀態(tài)(Blocked):通過調(diào)用join()海渊、sleep()绵疲、wait()或者資源被暫用使線程處于阻塞(blocked)狀態(tài);處于Blocking狀態(tài)的線程仍然是活著的(alive)

死亡狀態(tài)(Dead):當(dāng)一個(gè)線程的run()方法運(yùn)行完畢或被中斷或被異常退出臣疑,該線程到達(dá)死亡(dead)狀態(tài)盔憨。此時(shí)可能仍然存在一個(gè)該Thread的實(shí)例對(duì)象,當(dāng)該Thready已經(jīng)不可能在被作為一個(gè)可被獨(dú)立執(zhí)行的線程對(duì)待了讯沈,線程的獨(dú)立的call stack已經(jīng)被dissolved红省。一旦某一線程進(jìn)入Dead狀態(tài)浓恳,他就再也不能進(jìn)入一個(gè)獨(dú)立線程的生命周期了铁材。對(duì)于一個(gè)處于Dead狀態(tài)的線程調(diào)用start()方法型雳,會(huì)出現(xiàn)一個(gè)運(yùn)行期(runtime exception)的異常;處于Dead狀態(tài)的線程不是活著的(not alive)儒老。

線程狀態(tài)圖

?線程的方法(Method)蝴乔、屬性(Property)

1)優(yōu)先級(jí)(priority)

每個(gè)類都有自己的優(yōu)先級(jí),一般property用1-10的整數(shù)表示驮樊,默認(rèn)優(yōu)先級(jí)是5,優(yōu)先級(jí)最高是10片酝;優(yōu)先級(jí)高的線程并不一定比優(yōu)先級(jí)低的線程執(zhí)行的機(jī)會(huì)高囚衔,只是執(zhí)行的機(jī)率高;默認(rèn)一個(gè)線程的優(yōu)先級(jí)和創(chuàng)建他的線程優(yōu)先級(jí)相同雕沿;

2)Thread.sleep()/sleep(long millis)

當(dāng)前線程睡眠/millis的時(shí)間(millis指定睡眠時(shí)間是其最小的不執(zhí)行時(shí)間练湿,因?yàn)閟leep(millis)休眠到達(dá)后,無法保證會(huì)被JVM立即調(diào)度)审轮;sleep()是一個(gè)靜態(tài)方法(static method) 肥哎,所以他不會(huì)停止其他的線程也處于休眠狀態(tài);線程sleep()時(shí)不會(huì)失去擁有的對(duì)象鎖疾渣。 作用:保持對(duì)象鎖篡诽,讓出CPU,調(diào)用目的是不讓當(dāng)前線程獨(dú)自霸占該進(jìn)程所獲取的CPU資源榴捡,以留一定的時(shí)間給其他線程執(zhí)行的機(jī)會(huì)杈女;

3)Thread.yield()

讓出CPU的使用權(quán),給其他線程執(zhí)行機(jī)會(huì)吊圾、讓同等優(yōu)先權(quán)的線程運(yùn)行(但并不保證當(dāng)前線程會(huì)被JVM再次調(diào)度达椰、使該線程重新進(jìn)入Running狀態(tài)),如果沒有同等優(yōu)先權(quán)的線程项乒,那么yield()方法將不會(huì)起作用啰劲。

4)thread.join()

使用該方法的線程會(huì)在此之間執(zhí)行完畢后再往下繼續(xù)執(zhí)行。

5)object.wait()

當(dāng)一個(gè)線程執(zhí)行到wait()方法時(shí)檀何,他就進(jìn)入到一個(gè)和該對(duì)象相關(guān)的等待池(Waiting Pool)中蝇裤,同時(shí)失去了對(duì)象的機(jī)鎖—暫時(shí)的廷支,wait后還要返還對(duì)象鎖。當(dāng)前線程必須擁有當(dāng)前對(duì)象的鎖猖辫,如果當(dāng)前線程不是此鎖的擁有者酥泞,會(huì)拋出IllegalMonitorStateException異常,所以wait()必須在synchronized block中調(diào)用。

6)object.notify()/notifyAll()

喚醒在當(dāng)前對(duì)象等待池中等待的第一個(gè)線程/所有線程啃憎。notify()/notifyAll()也必須擁有相同對(duì)象鎖芝囤,否則也會(huì)拋出IllegalMonitorStateException異常。

7)Synchronizing Block

Synchronized Block/方法控制對(duì)類成員變量的訪問辛萍;Java中的每一個(gè)對(duì)象都有唯一的一個(gè)內(nèi)置的鎖悯姊,每個(gè)Synchronized Block/方法只有持有調(diào)用該方法被鎖定對(duì)象的鎖才可以訪問,否則所屬線程阻塞贩毕;機(jī)鎖具有獨(dú)占性悯许、一旦被一個(gè)Thread持有,其他的Thread就不能再擁有(不能訪問其他同步方法)辉阶,方法一旦執(zhí)行先壕,就獨(dú)占該鎖,直到從該方法返回時(shí)才將鎖釋放谆甜,此后被阻塞的線程方能獲得該鎖垃僚,重新進(jìn)入可執(zhí)行狀態(tài)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末规辱,一起剝皮案震驚了整個(gè)濱河市谆棺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罕袋,老刑警劉巖改淑,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異浴讯,居然都是意外死亡朵夏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門兰珍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來侍郭,“玉大人,你說我怎么就攤上這事掠河×猎” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵唠摹,是天一觀的道長(zhǎng)爆捞。 經(jīng)常有香客問我,道長(zhǎng)勾拉,這世上最難降的妖魔是什么煮甥? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任盗温,我火速辦了婚禮,結(jié)果婚禮上成肘,老公的妹妹穿的比我還像新娘卖局。我一直安慰自己,他們只是感情好双霍,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布砚偶。 她就那樣靜靜地躺著,像睡著了一般洒闸。 火紅的嫁衣襯著肌膚如雪染坯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天丘逸,我揣著相機(jī)與錄音单鹿,去河邊找鬼。 笑死深纲,一個(gè)胖子當(dāng)著我的面吹牛仲锄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播湃鹊,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼昼窗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了涛舍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤唆途,失蹤者是張志新(化名)和其女友劉穎富雅,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體肛搬,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡没佑,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了温赔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛤奢。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖陶贼,靈堂內(nèi)的尸體忽然破棺而出啤贩,到底是詐尸還是另有隱情,我是刑警寧澤拜秧,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布痹屹,位于F島的核電站,受9級(jí)特大地震影響枉氮,放射性物質(zhì)發(fā)生泄漏志衍。R本人自食惡果不足惜暖庄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望楼肪。 院中可真熱鬧培廓,春花似錦、人聲如沸春叫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)象缀。三九已至蔬将,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間央星,已是汗流浹背霞怀。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留莉给,地道東北人毙石。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颓遏,于是被迫代替她去往敵國(guó)和親徐矩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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