Java線程狀態(tài)詳解及常用方法介紹

? ? ? ? ? ? ? ? ? ? 過硬的技術(shù)?+?透徹的金融業(yè)務(wù) + 心理學(xué) =?互聯(lián)網(wǎng)金融專家

寫在文章前面的:在之前的Java中級(jí)甚至Java的高級(jí)開發(fā)面試中辛块,一般java的多線程開發(fā)就是問問基本問題每币,但今年隨著社會(huì)大經(jīng)濟(jì)環(huán)境的變化乙漓,和過剩的開發(fā)人員的涌現(xiàn)胃榕,所以市場(chǎng)要求也越來越高俘枫,多線程也成了必須要重點(diǎn)掌握的知識(shí)點(diǎn)译断。

多線程和多任務(wù)往往是使用多處理器系統(tǒng)的最合理方式谦炒。因?yàn)椴l(fā)在單處理器上執(zhí)行是沒有意義的挫剑,在單處理器上并發(fā)和順序的執(zhí)行并沒有什么本質(zhì)的區(qū)別去扣。

使用多線程的好處就是更好的利用CPU的性能,更好的用戶體驗(yàn)等樊破。

一愉棱、線程的基本知識(shí)

了解線程之前必須要了解進(jìn)程了,進(jìn)程是指運(yùn)行中的應(yīng)用程序捶码,每個(gè)進(jìn)程都有自己獨(dú)立的地址空間(內(nèi)存空間)羽氮,比如用戶點(diǎn)擊桌面的IE瀏覽器,就啟動(dòng)了一個(gè)進(jìn)程惫恼,操作系統(tǒng)就會(huì)為該進(jìn)程分配獨(dú)立的地址空間档押。當(dāng)用戶再次點(diǎn)擊左面的IE瀏覽器,又啟動(dòng)了一個(gè)進(jìn)程祈纯,操作系統(tǒng)將為新的進(jìn)程分配新的獨(dú)立的地址空間令宿。目前操作系統(tǒng)都支持多進(jìn)程。

而線程是進(jìn)程的一個(gè)實(shí)體腕窥,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位粒没,線程自己不擁有系統(tǒng)資源,只擁有在運(yùn)行中必不可少的資源簇爆,但它可與同屬一個(gè)進(jìn)程的其他線程共享進(jìn)程所擁有的全部資源癞松。一個(gè)線程可以創(chuàng)建和撤銷另一個(gè)線程爽撒,同一個(gè)進(jìn)程中的多個(gè)線程之間可以并發(fā)執(zhí)行。

二响蓉、線程的狀態(tài)

線程一共有五種狀態(tài)(等待和超時(shí)等待歸屬于等待):New(新建)硕勿,Runnable(可運(yùn)行),Blocked(阻塞狀態(tài))枫甲,Waiting(等待狀態(tài) 和? Timed Waiting(超時(shí)等待)) 源武,Terminated(終止)

三、常用方法詳解

常用方法有:start()想幻,run()粱栖,wait(),sleep()脏毯,notify()闹究,notifyAll(),join()食店,yield()跋核,park(),unpark()叛买,join()砂代,synchronized 方法或方法塊。

1率挣、start() :?jiǎn)?dòng)相應(yīng)線程刻伊,該方法的返回并不代表相應(yīng)的線程被啟動(dòng)。一個(gè)Thread實(shí)例的start方法只能夠被調(diào)用一次椒功,多次調(diào)用會(huì)導(dǎo)致異常的拋出捶箱。

2、run():用于實(shí)現(xiàn)線程的任務(wù)處理邏輯动漾。該方法是由Java虛擬機(jī)直接調(diào)用的丁屎,一般情況下應(yīng)用程序不應(yīng)該調(diào)用該方法。

3旱眯、wait():讓線程等待或者使用wait(3000)的方式將線程阻塞3秒鐘晨川,sleep()方法也是可以將線程休眠或者休眠一定時(shí)間的,兩個(gè)方法都可以引起阻塞删豺。

4共虑、notify() 是喚醒線程,API文檔:Wakes up a single thread that is waiting on this object's monitor呀页。 NotifyAll() 在API文檔中解釋為:Wakes up all threads that are waiting on this object's monitor.(歡迎所有線程妈拌,可以作用于wait(),當(dāng)然也可以作用于sleep()的線程)蓬蝶。

notify():?jiǎn)拘岩粋€(gè)處于等待狀態(tài)的線程尘分,在調(diào)用此方法的時(shí)候猜惋,并不能確切的喚醒某一個(gè)等待狀態(tài)的線程,而是由JVM確定喚醒哪個(gè)線程培愁,而且與優(yōu)先級(jí)無關(guān)惨奕;

notityAll():?jiǎn)拘阉刑幱诘却隣顟B(tài)的線程,該方法并不是將對(duì)象的鎖給所有線程竭钝,而是讓它們競(jìng)爭(zhēng),只有獲得鎖的線程才能進(jìn)入就緒狀態(tài)雹洗;

5香罐、park() 和unpark(),unpark函數(shù)為線程提供“許可(permit)”时肿,線程調(diào)用park函數(shù)則等待“許可”庇茫。這個(gè)有點(diǎn)像信號(hào)量,但是這個(gè)“許可”是不能疊加的螃成,“許可”是一次性的旦签。比如線程B連續(xù)調(diào)用了三次unpark函數(shù),當(dāng)線程A調(diào)用park函數(shù)就使用掉這個(gè)“許可”寸宏,如果線程A再次調(diào)用park宁炫,則進(jìn)入等待狀態(tài)。注意氮凝,unpark函數(shù)可以先于park調(diào)用羔巢。比如線程B調(diào)用unpark函數(shù),給線程A發(fā)了一個(gè)“許可”罩阵,那么當(dāng)線程A調(diào)用park時(shí)竿秆,它發(fā)現(xiàn)已經(jīng)有“許可”了,那么它會(huì)馬上再繼續(xù)運(yùn)行稿壁。

6幽钢、join(),該方法只會(huì)使主線程進(jìn)入等待池并等待t線程執(zhí)行完畢后才會(huì)被喚醒傅是。并不影響同一時(shí)刻處在運(yùn)行狀態(tài)的其他線程匪燕。

7、yield()喧笔,調(diào)用yield方法會(huì)讓當(dāng)前線程交出CPU權(quán)限谎懦,讓CPU去執(zhí)行其他的線程。它跟sleep方法類似溃斋,同樣不會(huì)釋放鎖界拦。但是yield不能控制具體的交出CPU的時(shí)間,另外梗劫,yield方法只能讓擁有相同優(yōu)先級(jí)的線程有獲取CPU執(zhí)行時(shí)間的機(jī)會(huì)享甸。而且截碴,調(diào)用yield方法并不會(huì)讓線程進(jìn)入阻塞狀態(tài),而是讓線程重回就緒狀態(tài)蛉威,它只需要等待重新獲取CPU執(zhí)行時(shí)間日丹,這一點(diǎn)是和sleep方法不一樣的。

wait()和sleep()的區(qū)別是:

? ? ?a:wait方法是作用在Object上的蚯嫌,而sleep是作用在線程上的哲虾,當(dāng)調(diào)用Thread.sleep時(shí),并不能改變對(duì)象的狀態(tài)择示。

證據(jù)如下:

? b:最主要是sleep方法沒有釋放鎖束凑,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法(鎖代碼塊和方法鎖)栅盲。

? c:wait汪诉,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用(使用范圍)?

? d:sleep必須捕獲異常谈秫,而wait扒寄,notify和notifyAll不需要捕獲異常?

sleep相當(dāng)于讓線程睡眠,交出CPU拟烫,讓CPU去執(zhí)行其他的任務(wù)该编。

注意:sleep方法不會(huì)釋放鎖,也就是說如果當(dāng)前線程持有對(duì)某個(gè)對(duì)象的鎖硕淑,則即使調(diào)用sleep方法上渴,其他線程也無法訪問這個(gè)對(duì)象。如果調(diào)用了sleep方法喜颁,必須捕獲InterruptedException異吵淼或者將該異常向上層拋出。當(dāng)線程睡眠時(shí)間滿后半开,不一定會(huì)立即得到執(zhí)行隔披,因?yàn)榇藭r(shí)可能CPU正在執(zhí)行其他的任務(wù)。所以說調(diào)用sleep方法相當(dāng)于讓線程進(jìn)入阻塞狀態(tài)寂拆。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奢米,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子纠永,更是在濱河造成了極大的恐慌鬓长,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,807評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尝江,死亡現(xiàn)場(chǎng)離奇詭異涉波,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門啤覆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苍日,“玉大人,你說我怎么就攤上這事窗声∠嗍眩” “怎么了?”我有些...
    開封第一講書人閱讀 169,589評(píng)論 0 363
  • 文/不壞的土叔 我叫張陵笨觅,是天一觀的道長(zhǎng)拦耐。 經(jīng)常有香客問我,道長(zhǎng)见剩,這世上最難降的妖魔是什么杀糯? 我笑而不...
    開封第一講書人閱讀 60,188評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮炮温,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘牵舵。我一直安慰自己柒啤,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評(píng)論 6 398
  • 文/花漫 我一把揭開白布畸颅。 她就那樣靜靜地躺著担巩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪没炒。 梳的紋絲不亂的頭發(fā)上涛癌,一...
    開封第一講書人閱讀 52,785評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音送火,去河邊找鬼拳话。 笑死,一個(gè)胖子當(dāng)著我的面吹牛种吸,可吹牛的內(nèi)容都是我干的弃衍。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼坚俗,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镜盯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起猖败,我...
    開封第一講書人閱讀 40,167評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤速缆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后恩闻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體艺糜,經(jīng)...
    沈念sama閱讀 46,698評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了倦踢。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片送滞。...
    茶點(diǎn)故事閱讀 40,912評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖辱挥,靈堂內(nèi)的尸體忽然破棺而出犁嗅,到底是詐尸還是另有隱情,我是刑警寧澤晤碘,帶...
    沈念sama閱讀 36,572評(píng)論 5 351
  • 正文 年R本政府宣布褂微,位于F島的核電站,受9級(jí)特大地震影響园爷,放射性物質(zhì)發(fā)生泄漏宠蚂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評(píng)論 3 336
  • 文/蒙蒙 一童社、第九天 我趴在偏房一處隱蔽的房頂上張望求厕。 院中可真熱鬧,春花似錦扰楼、人聲如沸呀癣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)项栏。三九已至,卻和暖如春蹬竖,著一層夾襖步出監(jiān)牢的瞬間沼沈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工币厕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留列另,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,359評(píng)論 3 379
  • 正文 我出身青樓旦装,卻偏偏與公主長(zhǎng)得像访递,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子同辣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評(píng)論 2 361

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