線程與進程的區(qū)別
在計算機發(fā)展初期,每臺計算機是串行地執(zhí)行任務(wù)的,如果碰上需要IO的地方,還需要等待長時間的用戶IO,后來經(jīng)過一段時間有了批處理計算機,其可以批量串行地處理用戶指令,但本質(zhì)還是串行,還是不能并發(fā)執(zhí)行。如何解決并發(fā)執(zhí)行的問題呢?于是引入了進程的概念,每個進程獨占一份內(nèi)存空間,進程是內(nèi)存分配的最小單位,相互間運行互不干擾且可以相互切換,現(xiàn)在我們所看到的多個進程“同時"在運行,實際上是進程高速切換的效果。
那么有了線程之后,我們的計算機系統(tǒng)看似已經(jīng)很完美了,為什么還要進入線程呢?如果一個進程有多個子任務(wù),往往一個進程需要逐個去執(zhí)行這些子任務(wù),但往往這些子任務(wù)是不相互依賴的,可以并發(fā)執(zhí)行,所以需要CPU進行更細(xì)粒度的切換。所以就引入了線程的概念,線程隸屬于某一個進程,它共享進程的內(nèi)存資源,相互間切換更快速。
進程與線程的區(qū)別:
1.進程是資源分配的最小單位,線程是CPU調(diào)度的最小單位。所有與進程相關(guān)的資源,均被記錄在PCB中。
2.線程隸屬于某一個進程,共享所屬進程的資源。線程只由堆棧寄存器、程序計數(shù)器和TCB構(gòu)成。
3.進程可以看作獨立的應(yīng)用,線程不能看作獨立的應(yīng)用。
4.進程有獨立的地址空間,相互不影響,而線程只是進程的不同執(zhí)行路徑,如果線程掛了,進程也就掛了。所以多進程的程序比多線程程序健壯,但是切換消耗資源多。
Java中進程與線程的關(guān)系:
1.運行一個程序會產(chǎn)生一個進程,進程至少包含一個線程。
2.每個進程對應(yīng)一個JVM實例,多個線程共享JVM中的堆。
3.Java采用單線程編程模型,程序會自動創(chuàng)建主線程 。
4.主線程可以創(chuàng)建子線程,原則上要后于子線程完成執(zhí)行。
線程的start方法和run方法的區(qū)別
區(qū)別
Java中創(chuàng)建線程的方式有兩種,不管使用繼承Thread的方式還是實現(xiàn)Runnable接口的方式,都需要重寫run方法。調(diào)用start方法會創(chuàng)建一個新的線程并啟動,run方法只是啟動線程后的回調(diào)函數(shù),如果調(diào)用run方法,那么執(zhí)行run方法的線程不會是新創(chuàng)建的線程,而如果使用start方法,那么執(zhí)行run方法的線程就是我們剛剛啟動的那個線程。
以上就是長沙達內(nèi)教育Java培訓(xùn)機構(gòu)小編介紹的“新手適合學(xué)習(xí)的Java多線程并發(fā)基礎(chǔ)”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)內(nèi)容
java多線程的狀態(tài)轉(zhuǎn)換以及基本操作
常見Java多線程面試題總結(jié)
Java多線程學(xué)習(xí),深入解析
Java基礎(chǔ)學(xué)習(xí)