前言
最近呢,有好多初入JAVA領(lǐng)域的初學(xué)者問(wèn)我多線程到底是什么呢橱乱?是不是就是進(jìn)程啊,所有人的問(wèn)題幾乎都一模一樣粱甫,說(shuō)在網(wǎng)上看了好多文章,都說(shuō)的特別高深作瞄,看完看不明白茶宵。
那么到底什么是多線程呢?它到底和進(jìn)程有什么區(qū)別呢宗挥?如何才能讓初學(xué)者也能明白這個(gè)東西到底是什么乌庶?下文就讓我們來(lái)站在小白的角度來(lái)深入的解析一下這個(gè)在日常編程領(lǐng)域無(wú)處不在的東西把!
線程
線程,有時(shí)被稱為輕量級(jí)進(jìn)程( Lightweight Process,LWP),是程序執(zhí)行流的最小單
元契耿。一個(gè)標(biāo)準(zhǔn)的線程由線程D,當(dāng)前指令指針(PC),寄存器集合和堆棧組成瞒大。另外
線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系
統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程
共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多
個(gè)線程之間可以并發(fā)執(zhí)行搪桂。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷
性透敌。線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)踢械。就緒狀態(tài)是指線程具備運(yùn)行的所有條
件,邏輯上可以運(yùn)行,在等待處理機(jī);運(yùn)行狀態(tài)是指線程占有處理機(jī)正在運(yùn)行;阻塞
狀態(tài)是指線程在等待一個(gè)事件(如某個(gè)信號(hào)量),邏輯上不可執(zhí)行酗电。每一個(gè)程序都至
少有一個(gè)線程,若程序只有一個(gè)線程,那就是程序本身
線程優(yōu)先級(jí)
雖然我們說(shuō)線程是并發(fā)運(yùn)行的。然而事實(shí)常常并非如此内列。正如前面談到的,當(dāng)系統(tǒng)中
有一個(gè)CPU時(shí),以某種順序在單CPU情況下執(zhí)行多線程被稱為調(diào)度( scheduling)
Java釆用的是一種簡(jiǎn)單撵术、固定的調(diào)度法,即固定優(yōu)先級(jí)調(diào)度。這種算法是根據(jù)處于可
運(yùn)行態(tài)線程的相對(duì)優(yōu)先級(jí)來(lái)實(shí)行調(diào)度话瞧。當(dāng)線程產(chǎn)生時(shí),它繼承原線程的優(yōu)先級(jí)嫩与。在需
要時(shí)可對(duì)優(yōu)先級(jí)進(jìn)行修改寝姿。在任何時(shí)刻,如果有多條線程等待運(yùn)行,系統(tǒng)選擇優(yōu)先級(jí)N
最高的可運(yùn)行線程運(yùn)行。只有當(dāng)它停止划滋、自動(dòng)放棄饵筑、或由于某種原因成為非運(yùn)行態(tài)低
優(yōu)先級(jí)的線程才能運(yùn)行。如果兩個(gè)線程具有相同的優(yōu)先級(jí),它們將被交替地
ava實(shí)時(shí)系統(tǒng)的線程調(diào)度算法還是強(qiáng)制性的,在任何時(shí)刻,如果一個(gè)其他線程優(yōu)先
級(jí)都高的線程的狀態(tài)變?yōu)榭蛇\(yùn)行態(tài),實(shí)時(shí)系統(tǒng)將選擇該線程來(lái)越個(gè)應(yīng)用程序可
以通過(guò)使用線程中的方法 setPriority(int),來(lái)設(shè)置線程的優(yōu)先級(jí)大小
進(jìn)程
狹義定義:進(jìn)程是正在運(yùn)行的程序的實(shí)例(an instance of a computer program that is being executed)古毛。
廣義定義:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)翻翩。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中稻薇,進(jìn)程既是基本的分配單元嫂冻,也是基本的執(zhí)行單元。
進(jìn)程的概念主要有兩點(diǎn):第一塞椎,進(jìn)程是一個(gè)實(shí)體桨仿。每一個(gè)進(jìn)程都有它自己的地址空間,一般情況下案狠,包括文本區(qū)域(text region)服傍、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼骂铁;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存吹零;堆棧區(qū)域存儲(chǔ)著活動(dòng)過(guò)程調(diào)用的指令和本地變量。第二拉庵,進(jìn)程是一個(gè)“執(zhí)行中的程序”灿椅。程序是一個(gè)沒(méi)有生命的實(shí)體,只有處理器賦予程序生命時(shí)(操作系統(tǒng)執(zhí)行之)钞支,它才能成為一個(gè)活動(dòng)的實(shí)體茫蛹,我們稱其為進(jìn)程。 [3]
進(jìn)程是操作系統(tǒng)中最基本烁挟、重要的概念婴洼。是多道程序系統(tǒng)出現(xiàn)后,為了刻畫系統(tǒng)內(nèi)部出現(xiàn)的動(dòng)態(tài)情況撼嗓,描述系統(tǒng)內(nèi)部各道程序的活動(dòng)規(guī)律引進(jìn)的一個(gè)概念,所有多道程序設(shè)計(jì)操作系統(tǒng)都建立在進(jìn)程的基礎(chǔ)上柬采。
是不是看了上面的還是一臉懵逼呢?看的云里霧里静稻。放心警没,一臉懵逼的進(jìn)來(lái)是不會(huì)讓你一臉懵逼的出去的。來(lái)振湾,看這里杀迹!我們來(lái)舉個(gè)例子來(lái)說(shuō)一下進(jìn)程和線程的聯(lián)系和區(qū)別你就會(huì)明白了。
假設(shè)用戶啟動(dòng)了一個(gè)窗口中的數(shù)據(jù)庫(kù)應(yīng)用程序,這個(gè)數(shù)據(jù)庫(kù)應(yīng)用程序就是咱們的進(jìn)程树酪,操作系統(tǒng)就將對(duì)數(shù)據(jù)庫(kù)的調(diào)用表示為一個(gè)進(jìn)程浅碾。假設(shè)用戶要從數(shù)據(jù)庫(kù)中產(chǎn)生一份工資單報(bào)表,并傳到一個(gè)文件中续语,這是一個(gè)子任務(wù)垂谢;在產(chǎn)生工資單報(bào)表的過(guò)程中,用戶又可以輸人數(shù)據(jù)庫(kù)查詢請(qǐng)求疮茄,這又是一個(gè)子任務(wù)滥朱。這樣,操作系統(tǒng)則把每一個(gè)請(qǐng)求――工資單報(bào)表和新輸人的數(shù)據(jù)查詢表示為數(shù)據(jù)庫(kù)進(jìn)程中的獨(dú)立的線程力试。線程可以在處理器上獨(dú)立調(diào)度執(zhí)行徙邻,這樣,在多處理器環(huán)境下就允許幾個(gè)線程各自在單獨(dú)處理器上進(jìn)行畸裳。操作系統(tǒng)提供線程就是為了方便而有效地實(shí)現(xiàn)這種并發(fā)性缰犁。是不是很清楚了,那么再想一下怖糊,為什么明明單線程也可以實(shí)現(xiàn)非要用多線程呢帅容?
(1)易于調(diào)度。
(2)提高并發(fā)性伍伤。通過(guò)線程可方便有效地實(shí)現(xiàn)并發(fā)性并徘。進(jìn)程可創(chuàng)建多個(gè)線程來(lái)執(zhí)行同一程序的不同部分。
(3)開(kāi)銷少扰魂。創(chuàng)建線程比創(chuàng)建進(jìn)程要快饮亏,所需開(kāi)銷很少。阅爽。
(4)利于充分發(fā)揮多處理器的功能。通過(guò)創(chuàng)建多線程進(jìn)程(即一個(gè)進(jìn)程可具有兩個(gè)或更多個(gè)線程)荐开,每個(gè)線程在一個(gè)處理器上運(yùn)行付翁,從而實(shí)現(xiàn)應(yīng)用程序的并發(fā)性,使每個(gè)處理器都得到充分運(yùn)行晃听。
進(jìn)程和線程的區(qū)別
(1)一個(gè)線程只能屬于一個(gè)進(jìn)程百侧,而一個(gè)進(jìn)程可以有多個(gè)線程,但至少有一個(gè)線程能扒。線程是操作系統(tǒng)可識(shí)別的最小執(zhí)行和調(diào)度單位佣渴。
(2)資源分配給進(jìn)程,同一進(jìn)程的所有線程共享該進(jìn)程的所有資源初斑。 同一進(jìn)程中的多個(gè)線程共享代碼段(代碼和常量)辛润,數(shù)據(jù)段(全局變量和靜態(tài)變量),擴(kuò)展段(堆存儲(chǔ))见秤。但是每個(gè)線程擁有自己的棧段砂竖,棧段又叫運(yùn)行時(shí)段真椿,用來(lái)存放所有局部變量和臨時(shí)變量。
(3)處理機(jī)分給線程乎澄,即真正在處理機(jī)上運(yùn)行的是線程突硝。
(4)線程在執(zhí)行過(guò)程中,需要協(xié)作同步置济。不同進(jìn)程的線程間要利用消息通信的辦法實(shí)現(xiàn)同步解恰。
怎么樣?是不是很清楚了浙于?那么咱們今天的文章就到這里啦护盈。是不是又學(xué)到了!如果還有想聽(tīng)的記得在下方留言哦路媚。說(shuō)不定下一篇就會(huì)講你想知道的內(nèi)容黄琼。