大數(shù)據(jù)開發(fā):Java線程與進程區(qū)別是這樣?
在JAVA中幾乎任何的操作系統(tǒng)都支持運行多個任務(wù),通常一個任務(wù)就是一個程序,而一個程序就是一個進程。當一個進程運行時,內(nèi)部可能包括多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程。
一、什么是進程
進程是資源(CPU、內(nèi)存等)分配的基本單位,它是程序執(zhí)行時的一個實例。程序運行時系統(tǒng)就會創(chuàng)建一個進程,并為它分配資源,然后把該進程放入進程就緒隊列,進程調(diào)度器選中它的時候就會為它分配CPU時間,程序開始真正運行。進程的優(yōu)點是提高CPU運行效率,在同一時間內(nèi)執(zhí)行多個程序,即并發(fā)執(zhí)行。但是從嚴格上講,也不是絕對的同一時刻執(zhí)行多個程序,只不過CPU在執(zhí)行時通過時間片等調(diào)度算法不同進程高速切換。進程類似于人類,是被產(chǎn)生的,有或長或短的有效生命,可以產(chǎn)生一個或多個子進程,最終都要消亡的。每個子進程都只有一個父進程。在這里順帶提下,Linux里通過調(diào)用fork()函數(shù)產(chǎn)生子進程。子進程在創(chuàng)建時,它幾乎和父進程相同。它是從父進程的地址空間copy過來的。盡管它們可以共享有程序代碼的頁,但是它們各自有獨立的數(shù)據(jù)空間。對子進程內(nèi)存的修改不會影響父進程,反之亦然。
二、 什么是線程
線程是一條執(zhí)行路徑,是程序執(zhí)行時的最小單位,它是進程的一個執(zhí)行流,是CPU調(diào)度和分派的基本單位,一個進程可以由很多個線程組成,線程間共享進程的所有資源,每個線程有自己的堆棧和局部變量。線程由CPU獨立調(diào)度執(zhí)行,在多CPU環(huán)境下就允許多個線程同時運行。同樣多線程也可以實現(xiàn)并發(fā)操作,每個請求分配一個線程來處理。線程是一條可以執(zhí)行的路徑。多線程就是同時有多條執(zhí)行路徑在同時(并行)執(zhí)行。
三、線程與進程的特點
(1)進程特點:
1:獨立性:進程是系統(tǒng)中獨立存在的實體,它可以獨立擁有資源,每一個進程都有自己獨立的地址空間,沒有進程本身的運行,用戶進程不可以直接訪問其他進程的地址空間。
2:動態(tài)性:進程和程序的區(qū)別在于進程是動態(tài)的,進程中有時間的概念,進程具有自己的生命周期和各種不同的狀態(tài)。
3:并發(fā)性:多個進程可以在單個處理器上并發(fā)執(zhí)行,互不影響。
(2)線程特點
1:輕型實體
線程中的實體單位基本上不擁有系統(tǒng)資源,只是有一點必不可少的、能保證獨立運行的資源。線程的實體包括程序、數(shù)據(jù)和TCB。線程是動態(tài)概念,他的動態(tài)特性由線程控制塊TCB描述。
2:獨立調(diào)度和分派的基本單位
再多線程OS中,線程是能獨立運行的基本單位,因而也是獨立調(diào)度和分派的基本單位。但由于線程很“輕”,故線程的切換非常迅速且開銷小(在統(tǒng)一進程中的)。
3:可并發(fā)執(zhí)行
在一個進程中的多個線程之間,可以并發(fā)執(zhí)行,甚至允許在一個進程中所有線程都能并發(fā)執(zhí)行;同樣,不同進程中的線程也能并發(fā)執(zhí)行,充分利用和發(fā)揮了處理機與外圍設(shè)備并行工作的能力。
4:共享進程資源
在同一進程中的各個線程,都可以共享該進程所擁有的資源,這首先表現(xiàn)在:所有線程都具有相同的地址空間(進程的地址空間),這意味者,線程可以訪問該地址空間的每一個虛地址;此外,還可以訪問該進程所擁有的已打開文件、定時器、信號量機構(gòu)等。由于同一個進程內(nèi)的線程共享內(nèi)存和文件,所以線程之間互相通信不必調(diào)用內(nèi)核。
四、進程和線程的區(qū)別:
1、容易創(chuàng)建新線程。但是,創(chuàng)建新進程需要重復(fù)父進程。
2、線程可以控制同一進程的其他線程。進程無法控制兄弟進程,只能控制其子進程。
3、進程擁有自己的內(nèi)存空間。線程使用進程的內(nèi)存空間,且要和該進程的其他線程共享這個空間;而不是在進程中給每個線程單獨劃分一點空間。
4、(同一進程中的)線程在共享內(nèi)存空間中運行,而進程在不同的內(nèi)存空間中運行。
5、線程可以使用wait(),notify(),notifyAll()等方法直接與其他線程(同一進程)通信;而,進程需要使用“進程間通信”(IPC)來與操作系統(tǒng)中的其他進程通信。
以上就是關(guān)于大數(shù)據(jù)開發(fā)基礎(chǔ)之JAVA線程進程的基礎(chǔ)知識,學(xué)以致用是大數(shù)據(jù)里面最好的學(xué)習方式,能讓你快速在行業(yè)中占領(lǐng)一席之地。