一:進程與線程
概述:幾乎任何的操作系統(tǒng)都支持運行多個任務(wù),通常一個任務(wù)就是一個程序,而一個程序就是一個進程。當(dāng)一個進程運行時,內(nèi)部可能包括多個順序執(zhí)行流,每個順序執(zhí)行流就是一個線程。
進程:進程是指處于運行過程中的程序,并且具有一定的獨立功能。進程是系統(tǒng)進行資源分配和調(diào)度的一個單位。當(dāng)程序進入內(nèi)存運行時,即為進程。
進程的三個特點:
1:獨立性:進程是系統(tǒng)中獨立存在的實體,它可以獨立擁有資源,每一個進程都有自己獨立的地址空間,沒有進程本身的運行,用戶進程不可以直接訪問其他進程的地址空間。
2:動態(tài)性:進程和程序的區(qū)別在于進程是動態(tài)的,進程中有時間的概念,進程具有自己的生命周期和各種不同的狀態(tài)。
3:并發(fā)性:多個進程可以在單個處理器上并發(fā)執(zhí)行,互不影響。
并發(fā)性和并行性是不同的概念:并行是指同一時刻,多個命令在多個處理器上同時執(zhí)行;并發(fā)是指在同一時刻,只有一條命令是在處理器上執(zhí)行的,但多個進程命令被快速輪換執(zhí)行,使得在宏觀上具有多個進程同時執(zhí)行的效果
注:
線程:
線程是進程的組成部分,一個進程可以擁有多個線程,而一個線程必須擁有一個父進程。線程可以擁有自己的堆棧,自己的程序計數(shù)器和自己的局部變量,但不能擁有系統(tǒng)資源。它與父進程的其他線程共享該進程的所有資源。
線程的特點:
線程可以完成一定任務(wù),可以和其它線程共享父進程的共享變量和部分環(huán)境,相互協(xié)作來完成任務(wù)。
線程是獨立運行的,其不知道進程中是否還有其他線程存在。
線程的執(zhí)行是搶占式的,也就是說,當(dāng)前執(zhí)行的線程隨時可能被掛起,以便運行另一個線程。
一個線程可以創(chuàng)建或撤銷另一個線程,一個進程中的多個線程可以并發(fā)執(zhí)行。
二、線程的創(chuàng)建及使用
java使用thread類代表線程,所有的線程對象都必須是thread或者其子類的實例,每個線程的作用是完成一定任務(wù),實際上是就是執(zhí)行一段程序流(一段順序執(zhí)行的代碼)
方案一:繼承thread類創(chuàng)建線程類
步驟:① 定義thread類的子類 并重寫該類的run方法,該run方法的方法體就代表了該線程需要完成的任務(wù)
② 創(chuàng)建thread類的實例,即創(chuàng)建了線程對象
③ 調(diào)用線程的start方法來啟動線程
結(jié)論:使用繼承子thread類的子類來創(chuàng)建線程類時,多個線程無法共享線程類的實例變量(比如上面的i)
方案二:實現(xiàn)runnable接口
①定義runnable接口的實現(xiàn)類,并重寫它的run方法,run方法同樣是該線程的執(zhí)行體!
②創(chuàng)建runnable實現(xiàn)類的實例,并將此實例作為thread的target創(chuàng)建一個thread對象,該thread對象才是真正的線程對象!
③調(diào)用start方法啟動該線程
結(jié)論:采用ruunable接口的方式創(chuàng)建多個線程可以共享線程類的實例變量,這是因為在這種方式下,程序創(chuàng)建的runnable對象只是線程的target,而多個線程可以共享一個target,所以多個線程可以共享一個實例變量
通過runnable實現(xiàn)多線程其實就是將run包裝成線程的執(zhí)行體,但是目前java無法將任意方法包裝成線程執(zhí)行體
方案三:使用callable和future創(chuàng)建線程從java5開始,java提供 callable接口,callable接口提供了一個call()方法可以作為線程執(zhí)行體,看起來和runnable很像,但call()方法更強大——call()方法可以有返回值、call()方法可以拋出異常
java5提供了future接口來代表callable接口的call()方法的返回值,并為future接口提供了一個futuretask實現(xiàn)類,該實現(xiàn)類實現(xiàn)類future接口,也實現(xiàn)了runnable接口——可以作為thread的target。
實現(xiàn)步驟:
①創(chuàng)建callable接口的實現(xiàn)類,并實現(xiàn)call方法,該call方法會成為線程執(zhí)行體,且call方法具有返回值,在創(chuàng)建callable接口的實現(xiàn)類!
②使用futruetask類來包裝callable對象,該futruetask封裝類callable的call方法的返回值
③使用futruetask對象作為thread的target創(chuàng)建并啟動新線程!
④使用futruetask的get方法獲取執(zhí)行結(jié)束后的返回值
結(jié)論:采取runnable、callable的優(yōu)勢在于——線程類只是實現(xiàn)了runnable或callable接口,還可以繼承其它類;在這種方法下,多個線程可以共享一個target對象,因此非常適合多個相同線程處理同一份資源的情況,從而將cpu、代碼和數(shù)據(jù)分開,形參清晰的模型,體現(xiàn)了面對對象的編程思想。劣勢在于編程復(fù)雜度略高。
以上這篇java中進程與線程_三種實現(xiàn)方式總結(jié)(必看篇)就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持服務(wù)器之家。