Java | 線程和進(jìn)程搀继,創(chuàng)建線程

一、線程與進(jìn)程

線程定義

進(jìn)程中執(zhí)行的一個(gè)代碼段翠语,來完成不同的任務(wù)

組成:線程ID叽躯,當(dāng)前指令指針(PC),寄存器集合(存儲(chǔ)一部分正在執(zhí)行線程的處理器狀態(tài)的值)和堆棧

進(jìn)程定義

執(zhí)行的一段程序肌括,一旦程序被載入到內(nèi)存中準(zhǔn)備執(zhí)行就是一個(gè)進(jìn)程

組成:文本區(qū)域(存儲(chǔ)處理器執(zhí)行的代碼)点骑、數(shù)據(jù)區(qū)域(存儲(chǔ)變量和進(jìn)程執(zhí)行期間的動(dòng)態(tài)分配的內(nèi)存)和堆棧(存儲(chǔ)著活動(dòng)過程調(diào)用的指令和本地變量)

例如Windows系統(tǒng)中運(yùn)行的一個(gè)exe就是一個(gè)進(jìn)程

進(jìn)入任務(wù)管理器,可以查看系統(tǒng)運(yùn)行的進(jìn)程谍夭,以及每個(gè)進(jìn)程中的線程數(shù)

線程與進(jìn)程的關(guān)系

1.? 進(jìn)程是系統(tǒng)內(nèi)存分配的最小單位黑滴,線程是系統(tǒng)調(diào)度的最小單位

進(jìn)程擁有自己的內(nèi)存空間,因?yàn)榫€程是屬于進(jìn)程的慧库,多線程直接共享該進(jìn)程中內(nèi)存跷跪,提高了程序的運(yùn)行效率

2.? 一個(gè)程序至少有一個(gè)進(jìn)程馋嗜,一個(gè)進(jìn)程中包括一條 or 多條線程齐板,線程不能獨(dú)立于進(jìn)程

在Java中,每次程序運(yùn)行至少啟動(dòng)2個(gè)線程:一個(gè)是main線程葛菇,一個(gè)是垃圾收集線程甘磨。因?yàn)槊慨?dāng)使用 Java 命令執(zhí)行一個(gè)類時(shí),都會(huì)啟動(dòng)一個(gè)JVM眯停,每一個(gè) JVM 實(shí)際上就是在操作系統(tǒng)中啟動(dòng)了一個(gè)進(jìn)程

3.? 進(jìn)程與線程都可以并發(fā)執(zhí)行

問題:如何了解 “并發(fā)” 執(zhí)行 济舆,它與 “并行”執(zhí)行一樣嗎?

并行執(zhí)行:從宏觀和微觀的角度莺债,都是同時(shí)執(zhí)行的

并發(fā)執(zhí)行:從宏觀角度滋觉,似乎是同時(shí)執(zhí)行;但從微觀角度齐邦,不是同時(shí)執(zhí)行

操作系統(tǒng)采取時(shí)間片的機(jī)制椎侠,使多個(gè)進(jìn)程(線程)快速切換執(zhí)行,在宏觀上就有并行執(zhí)行的錯(cuò)覺

在單核情況下措拇,不存在并行執(zhí)行我纪;但在多核情況下,進(jìn)程(線程)分布在不同的CPU中丐吓,可以并行執(zhí)行程序

二浅悉、線程的生命周期

線程是一個(gè)動(dòng)態(tài)執(zhí)行的過程

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

創(chuàng)建線程對(duì)象,進(jìn)入新建狀態(tài)券犁,此時(shí)線程屬于 not? alive术健,直到執(zhí)行 start()

創(chuàng)建線程: 使用 new 關(guān)鍵字和 Thread 類或其子類, 例如:Thread?? t? = new? MyThread();

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

調(diào)用線程對(duì)象的 start() 方法粘衬,進(jìn)入就緒狀態(tài)荞估,此時(shí)線程屬于 alive 比被,但還未進(jìn)入執(zhí)行,只是做好了被 CPU 調(diào)度的準(zhǔn)備

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

當(dāng)線程獲取到CPU泼舱,進(jìn)入運(yùn)行狀態(tài)等缀,線程的 run() 方法才開始被執(zhí)行,此時(shí)線程屬于 alive

只有當(dāng)線程處于就緒狀態(tài)娇昙,才能被CPU調(diào)度尺迂,所以就緒狀態(tài)是運(yùn)行狀態(tài)的唯一入口

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

處于運(yùn)行狀態(tài)的線程,由于某種原因冒掌,放棄使用CPU噪裕,停止運(yùn)行,進(jìn)入阻塞狀態(tài)股毫,此時(shí)線程屬于 alive

同步阻塞

同步鎖 synchronized膳音,當(dāng)某線程占有了該同步鎖, 則其他線程就不能進(jìn)入到同步鎖中铃诬,則這些線程就會(huì)進(jìn)入阻塞狀態(tài)

當(dāng)在阻塞隊(duì)列的線程獲取到同步鎖時(shí)祭陷,才能進(jìn)入到就緒狀態(tài)等待被調(diào)度

等待阻塞:(理解得有點(diǎn)繞)

調(diào)用線程的 wait() ,線程進(jìn)入等待狀態(tài)趣席,此時(shí)會(huì)釋放占用的 CPU 資源和鎖(wait()方法需要在鎖中使用)

當(dāng)被其他線程調(diào)用 notify() 喚醒之后兵志,需要重新獲取對(duì)象的鎖,所以會(huì)先進(jìn)入Blocked狀態(tài)宣肚,才會(huì)進(jìn)入就緒狀態(tài)

其他阻塞

調(diào)用線程的 sleep() 或 join() 或 發(fā)出了I/O請(qǐng)求想罕,線程會(huì)進(jìn)入到阻塞狀態(tài)

當(dāng) sleep() 狀態(tài)超時(shí)、join() 等待線程終止或者超時(shí)霉涨、或者 I/O 處理完畢時(shí)按价,線程重新進(jìn)入就緒狀態(tài)

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

當(dāng)一個(gè)線程的 run() 方法運(yùn)行完畢 or 被中斷 or 被異常退出,該線程進(jìn)入死亡狀態(tài)

三笙瑟、線程的創(chuàng)建

-?? 實(shí)現(xiàn) Runnable 接口楼镐,實(shí)例化 Thread 類(線程無返回值)

- ? 繼承 Thread 類,重寫 Thread 的 run() 方法(線程無返回值)

-?? 實(shí)現(xiàn) Callable 接口逮走,通過 FutureTask 包裝器創(chuàng)建線程(線程有返回值)

1.? 實(shí)現(xiàn) Runnable 接口鸠蚪,實(shí)例化 Thread 類(線程無返回值)

step1:? 創(chuàng)建一個(gè)類,例如 RunnableThread师溅,實(shí)現(xiàn) Runnable 接口

step2:? 實(shí)例化 RunnableThread 對(duì)象茅信, 創(chuàng)建 Thread 對(duì)象,將 RunnableThread 作為參數(shù)傳給 Thread 類的構(gòu)造函數(shù)墓臭,然后通過 Thread.start() 方法啟動(dòng)線程

運(yùn)行結(jié)果

問題: 為什么創(chuàng)建 RunnableThread 對(duì)象后蘸鲸,需要將它和 Thread 對(duì)象進(jìn)行關(guān)聯(lián)?

查看 Runnable 接口的源代碼窿锉,可以看到 Runnable 接口只有一個(gè) run() 方法酌摇,所以需要通過 Thread 類的 start() 方法來啟動(dòng)線程

啟動(dòng)線程后膝舅,Thread 類中的 run() 方法會(huì)先判斷傳入的 target Runnable 對(duì)象的 run() 方法是否為空,若不為空窑多,則調(diào)用 target Runnable 對(duì)象的 run() 方法

而且仍稀,RunnableThread 類實(shí)現(xiàn) Runnbale 接口中不能直接使用 Thread 類中的方法,需要先獲取到Thread 對(duì)象后埂息,才能調(diào)用 Thread 方法

2.? 繼承 Thread 類技潘,重寫 Thread 的 run() 方法(線程無返回值)

step1:? 創(chuàng)建一個(gè)類,例如 MyThread千康,繼承 Thread 類享幽,重寫 Thread 的 run() 方法

step2:? 實(shí)例化 MyThread 對(duì)象,直接調(diào)用 start() 方法啟動(dòng)線程

運(yùn)行結(jié)果

問題:實(shí)現(xiàn) Runnable 接口 和 繼承 Thread 類拾弃,運(yùn)行結(jié)果不一樣值桩,這是為什么?

繼承 Thread 類和實(shí)現(xiàn) Runnable 接口實(shí)現(xiàn)多線程豪椿,會(huì)發(fā)現(xiàn)這是兩個(gè)不同的實(shí)現(xiàn)多線程

繼承 Thread 類是多個(gè)線程分別完成自己的任務(wù)

實(shí)現(xiàn) Runnable 接口是多個(gè)線程共同完成一個(gè)任務(wù)奔坟,其實(shí)用繼承Thread類也可以實(shí)現(xiàn),只是比較麻煩

這樣的話砂碉,實(shí)現(xiàn) Runnable 接口比繼承 Thread 類具有一定的優(yōu)勢

1)適合多個(gè)相同的程序代碼的線程去處理同一個(gè)資源

2)可以避免 Java 中的單繼承的限制

當(dāng)一個(gè)類繼承 Thread 類后蛀蜜,則不能在繼承別的類,而接口比較靈活增蹭,可以實(shí)現(xiàn)多個(gè)接口,而且實(shí)現(xiàn)接口了還可繼續(xù)繼承一個(gè)類

3)增加程序的健壯性磅摹,代碼可以被多個(gè)線程共享滋迈,代碼和數(shù)據(jù)獨(dú)立

參考鏈接:https://www.cnblogs.com/CryOnMyShoulder/p/8028122.html

?????????????????https://www.cnblogs.com/xubiao/p/5418141.html

3.? 實(shí)現(xiàn) Callable 接口,通過 FutureTask 包裝器創(chuàng)建線程(線程有返回值)

step1:? 創(chuàng)建一個(gè)類户誓,例如 CallableThread饼灿,實(shí)現(xiàn) Callable 接口,重寫 Callable 接口的 call() 方法

step2:? 實(shí)例化 CallableThread 對(duì)象帝美,使用 FutureTask 類來包裝 CallableThread 對(duì)象

然后 FutureTask 對(duì)象作為參數(shù)傳給 Thread 類的構(gòu)造函數(shù)碍彭,通過 Thread.start() 方法啟動(dòng)線程

使用 FutureTask.get() 得到 Callable 接口的 call() 方法的返回值

返回結(jié)果

Callable 和 Runnable 相似,類實(shí)例都需要被 Thread 執(zhí)行悼潭,但 Callable 接口能返回一個(gè)值或者拋出一個(gè)異常庇忌,Runnable 不能

實(shí)現(xiàn) Callable 接口需要重寫其唯一的 call() 方法

FutureTask 實(shí)現(xiàn)了 Runable 接口 和 Future 接口,所以如果想 Callable 實(shí)例作為 Thread 的執(zhí)行體就必須通過 FutureTask 來作為橋梁


參考鏈接:https://www.cnblogs.com/ganchuanpu/p/7704468.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舰褪,一起剝皮案震驚了整個(gè)濱河市皆疹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌占拍,老刑警劉巖略就,帶你破解...
    沈念sama閱讀 217,826評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捎迫,死亡現(xiàn)場離奇詭異,居然都是意外死亡表牢,警方通過查閱死者的電腦和手機(jī)窄绒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來崔兴,“玉大人颗祝,你說我怎么就攤上這事∧詹迹” “怎么了螺戳?”我有些...
    開封第一講書人閱讀 164,234評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長折汞。 經(jīng)常有香客問我倔幼,道長,這世上最難降的妖魔是什么爽待? 我笑而不...
    開封第一講書人閱讀 58,562評(píng)論 1 293
  • 正文 為了忘掉前任损同,我火速辦了婚禮,結(jié)果婚禮上鸟款,老公的妹妹穿的比我還像新娘膏燃。我一直安慰自己,他們只是感情好何什,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評(píng)論 6 392
  • 文/花漫 我一把揭開白布组哩。 她就那樣靜靜地躺著,像睡著了一般处渣。 火紅的嫁衣襯著肌膚如雪伶贰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評(píng)論 1 302
  • 那天罐栈,我揣著相機(jī)與錄音黍衙,去河邊找鬼。 笑死荠诬,一個(gè)胖子當(dāng)著我的面吹牛琅翻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柑贞,決...
    沈念sama閱讀 40,271評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼方椎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了凌外?” 一聲冷哼從身側(cè)響起辩尊,我...
    開封第一講書人閱讀 39,166評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎康辑,沒想到半個(gè)月后摄欲,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體轿亮,經(jīng)...
    沈念sama閱讀 45,608評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評(píng)論 3 336
  • 正文 我和宋清朗相戀三年胸墙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了我注。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡迟隅,死狀恐怖但骨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情智袭,我是刑警寧澤奔缠,帶...
    沈念sama閱讀 35,644評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吼野,受9級(jí)特大地震影響校哎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瞳步,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評(píng)論 3 329
  • 文/蒙蒙 一闷哆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧单起,春花似錦抱怔、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至括儒,卻和暖如春绕沈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帮寻。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赠摇,地道東北人固逗。 一個(gè)月前我還...
    沈念sama閱讀 48,063評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像藕帜,于是被迫代替她去往敵國和親烫罩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評(píng)論 2 354

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

  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過程中...
    勝浩_ae28閱讀 5,108評(píng)論 0 23
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過程中...
    小徐andorid閱讀 2,808評(píng)論 3 53
  • 單任務(wù) 單任務(wù)的特點(diǎn)是排隊(duì)執(zhí)行洽故,也就是同步贝攒,就像再cmd輸入一條命令后,必須等待這條命令執(zhí)行完才可以執(zhí)行下一條命令...
    Steven1997閱讀 1,178評(píng)論 0 6
  • 線程概述 線程與進(jìn)程 進(jìn)程 ?每個(gè)運(yùn)行中的任務(wù)(通常是程序)就是一個(gè)進(jìn)程时甚。當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí)隘弊,即變成了一個(gè)進(jìn)...
    閩越布衣閱讀 1,009評(píng)論 1 7
  • 上回講到哈踱,用戶端如何派單,今天要講的梨熙,是派單完成后开镣,生成訂單的界面,及支付輸入密碼的頁面設(shè)計(jì)咽扇。 我的訂單可...
    一盒甜豆奶_閱讀 259評(píng)論 0 3