8.1線程的概念
考點:1
線程的概念
1.線程
(1)線程是由表示程序運行狀態(tài)的寄存器(包括程序計數(shù)器和堆棧)組成的。
(2)線程是程序執(zhí)行過程中的某一時刻的狀態(tài)。
(3)線程是一個用戶級的實體,在內(nèi)存中駐留在普通用戶級方法可以直接訪問的區(qū)域。
(4)每個線程都是一個能夠獨立執(zhí)行自身指令的控制流程。
(5)操作系統(tǒng)通過對多線程的調(diào)度實現(xiàn)線程的并發(fā)執(zhí)行。
(6)線程本身并不是一個程序而是運行于一個程序或者進程中。
(7)線程是個動態(tài)的概念,有其自身的產(chǎn)生、存在和消亡的過程。
(8)Java通過在程序中提供多線程支持來提高線程的安全性。
(9)線程是程序中的一個單個執(zhí)行流,多線程是程序中的多個執(zhí)行流。
2.程序、線程和進程
(1)程序是一段靜態(tài)的代碼、是應(yīng)用軟件執(zhí)行的藍本。
(2)進程是程序的一次動態(tài)執(zhí)行過程,包括程序加載、執(zhí)行到結(jié)束。
(3)線程是比進程更小的執(zhí)行單位,一個進程可以包含多個線程。
(4)進程是由代碼、數(shù)據(jù)、內(nèi)核狀態(tài)和一組寄存器組成的。
(5)線程不包含進程的地址空間中的代碼和數(shù)據(jù)。
考點:2
Java語言中的線程
(1)Java語言中的線程包括3部分:虛擬CPU、該CPU執(zhí)行的代碼,以及代碼所操作的數(shù)據(jù)。
(2) Java語言中代碼和數(shù)據(jù)相互獨立,代碼可以在不同的線程之間共享,同樣數(shù)據(jù)也可以在不同的線程之間共享。
(3) java.lang.Thread類定義了Java語言中的線程模型,用戶可以通過該類創(chuàng)建、定義和控制自己的線程。
8.2線程的創(chuàng)建
考點:3
線程的創(chuàng)建
在Java中,通過調(diào)用Thread類的構(gòu)造方法來創(chuàng)建線程對象,線程執(zhí)行的入口方法是run(),可以有兩種提供run()方法的實現(xiàn)方式。
1.通過實現(xiàn)Runnable接口
創(chuàng)建過程Thread類使用一個Runnable的實例作為其構(gòu)造方法,該實例對象提供了線程體run(),線程從該run()方法開始執(zhí)行。新建的線程必須通過調(diào)用線程的start ()方法才能運行。
2.通過繼承Thread類
Thread類本身實現(xiàn)了Runnable接口,因此Thread類含有run()方法。通過繼承Thread類,并且重寫其run()方法,來創(chuàng)建線程。
以上兩種方法的比較如下:
(1)實現(xiàn)Runnable接口的方法符合面向?qū)ο蟮乃枷耄瑢崿F(xiàn)了Runnable接口的類,可以很容易地繼承其他的類。一般都提倡使用這種方法。
(2)繼承Thread類的方法,比較簡單,可以直接調(diào)用線程的方法??梢砸暰唧w應(yīng)用而定。
8.3線程的調(diào)度與線程控制
考點:4
線程優(yōu)先級和調(diào)度策略
線程的優(yōu)先級,在Thread類中提供了3個靜態(tài)常量:MIN_PRIORITY = 1、MAX_PRIORITY = 10、NORM_PRIORITY = 5來控制線程的優(yōu)先級,數(shù)值越大優(yōu)先級越高。子線程繼承父線程的優(yōu)先級,主線程具有普通優(yōu)先級??梢酝ㄟ^getPriority()方法獲取線程的優(yōu)先級,通過setPriority()設(shè)定線程的優(yōu)先級。
線程調(diào)度是指:在單個CPU上以一定策略控制多個線程的執(zhí)行,這種策略是搶占式調(diào)度,簡單地說,就是指高優(yōu)先級的線程首先運行,低優(yōu)先級的線程被高優(yōu)先級線程搶占執(zhí)行。在Java中,系統(tǒng)按照優(yōu)先級的不同設(shè)置不同的線程等待池,首先運行高優(yōu)先級等待池的線程,然后再運行低優(yōu)先級等待池的線程。
考點:5
線程的控制
要控制線程,可以使用Thread類提供的如下方法:
(1)sleep(),一個線程通過調(diào)用此方法暫停運行線程一定時間
(2)yield(),一個線程通過調(diào)用此方法使與其具有相同的優(yōu)先級的線程有運行的機會。
(3)join(),若在當(dāng)前線程中執(zhí)行th.join)方法,則當(dāng)前線程暫停運行,等待另一線程th運行結(jié)束,才恢復(fù)到可運行狀態(tài)。
(4)interrupt(),調(diào)用該方法可使線程從阻塞狀態(tài)中恢復(fù)。
(5)currentThread(),該方法是靜態(tài)方法,用于返回當(dāng)前線程的引用。
(6)isAlive(),用于判斷線程時候還處于活動狀態(tài)。
(7)stop(),強行終止線程。
(8)suspend()和resume(),前者用于暫停一個線程,后者用于恢復(fù)該線程。
8.4線程的同步
考點:6
對象的加鎖及其操作
多線程并發(fā)操作時,由于各線程對共享數(shù)據(jù)的操作順序不同,會影響程序的執(zhí)行結(jié)果,因此Java語言使傳統(tǒng)的加鎖技術(shù)對共享數(shù)據(jù)的操作進行并發(fā)控制。
1.對象加鎖及其操作
臨界區(qū)是指程序中的一個代碼段,在這段代碼中,單獨并發(fā)的線程對同一個對象進行訪問。在Java中,用關(guān)鍵字“synchronized”標(biāo)識一個臨界區(qū)。
對象鎖是指Java為synchronized(Object)語句指定的對象進行加鎖,對象鎖是獨占排他鎖。
2.對象加鎖的注意事項
使用對象鎖需要注意如下幾點:
(1)釋放對象鎖的情況:synchronized()語句塊執(zhí)行完,synchronized()語句塊出現(xiàn)異常、持有鎖的線程調(diào)用該對象的wait()方法。
(2)所有被訪問的共享數(shù)據(jù)及訪問代碼都必須作為臨界區(qū),用synchronized加鎖。
考點:1
線程的概念
1.線程
(1)線程是由表示程序運行狀態(tài)的寄存器(包括程序計數(shù)器和堆棧)組成的。
(2)線程是程序執(zhí)行過程中的某一時刻的狀態(tài)。
(3)線程是一個用戶級的實體,在內(nèi)存中駐留在普通用戶級方法可以直接訪問的區(qū)域。
(4)每個線程都是一個能夠獨立執(zhí)行自身指令的控制流程。
(5)操作系統(tǒng)通過對多線程的調(diào)度實現(xiàn)線程的并發(fā)執(zhí)行。
(6)線程本身并不是一個程序而是運行于一個程序或者進程中。
(7)線程是個動態(tài)的概念,有其自身的產(chǎn)生、存在和消亡的過程。
(8)Java通過在程序中提供多線程支持來提高線程的安全性。
(9)線程是程序中的一個單個執(zhí)行流,多線程是程序中的多個執(zhí)行流。
2.程序、線程和進程
(1)程序是一段靜態(tài)的代碼、是應(yīng)用軟件執(zhí)行的藍本。
(2)進程是程序的一次動態(tài)執(zhí)行過程,包括程序加載、執(zhí)行到結(jié)束。
(3)線程是比進程更小的執(zhí)行單位,一個進程可以包含多個線程。
(4)進程是由代碼、數(shù)據(jù)、內(nèi)核狀態(tài)和一組寄存器組成的。
(5)線程不包含進程的地址空間中的代碼和數(shù)據(jù)。
考點:2
Java語言中的線程
(1)Java語言中的線程包括3部分:虛擬CPU、該CPU執(zhí)行的代碼,以及代碼所操作的數(shù)據(jù)。
(2) Java語言中代碼和數(shù)據(jù)相互獨立,代碼可以在不同的線程之間共享,同樣數(shù)據(jù)也可以在不同的線程之間共享。
(3) java.lang.Thread類定義了Java語言中的線程模型,用戶可以通過該類創(chuàng)建、定義和控制自己的線程。
8.2線程的創(chuàng)建
考點:3
線程的創(chuàng)建
在Java中,通過調(diào)用Thread類的構(gòu)造方法來創(chuàng)建線程對象,線程執(zhí)行的入口方法是run(),可以有兩種提供run()方法的實現(xiàn)方式。
1.通過實現(xiàn)Runnable接口
創(chuàng)建過程Thread類使用一個Runnable的實例作為其構(gòu)造方法,該實例對象提供了線程體run(),線程從該run()方法開始執(zhí)行。新建的線程必須通過調(diào)用線程的start ()方法才能運行。
2.通過繼承Thread類
Thread類本身實現(xiàn)了Runnable接口,因此Thread類含有run()方法。通過繼承Thread類,并且重寫其run()方法,來創(chuàng)建線程。
以上兩種方法的比較如下:
(1)實現(xiàn)Runnable接口的方法符合面向?qū)ο蟮乃枷耄瑢崿F(xiàn)了Runnable接口的類,可以很容易地繼承其他的類。一般都提倡使用這種方法。
(2)繼承Thread類的方法,比較簡單,可以直接調(diào)用線程的方法??梢砸暰唧w應(yīng)用而定。
8.3線程的調(diào)度與線程控制
考點:4
線程優(yōu)先級和調(diào)度策略
線程的優(yōu)先級,在Thread類中提供了3個靜態(tài)常量:MIN_PRIORITY = 1、MAX_PRIORITY = 10、NORM_PRIORITY = 5來控制線程的優(yōu)先級,數(shù)值越大優(yōu)先級越高。子線程繼承父線程的優(yōu)先級,主線程具有普通優(yōu)先級??梢酝ㄟ^getPriority()方法獲取線程的優(yōu)先級,通過setPriority()設(shè)定線程的優(yōu)先級。
線程調(diào)度是指:在單個CPU上以一定策略控制多個線程的執(zhí)行,這種策略是搶占式調(diào)度,簡單地說,就是指高優(yōu)先級的線程首先運行,低優(yōu)先級的線程被高優(yōu)先級線程搶占執(zhí)行。在Java中,系統(tǒng)按照優(yōu)先級的不同設(shè)置不同的線程等待池,首先運行高優(yōu)先級等待池的線程,然后再運行低優(yōu)先級等待池的線程。
考點:5
線程的控制
要控制線程,可以使用Thread類提供的如下方法:
(1)sleep(),一個線程通過調(diào)用此方法暫停運行線程一定時間
(2)yield(),一個線程通過調(diào)用此方法使與其具有相同的優(yōu)先級的線程有運行的機會。
(3)join(),若在當(dāng)前線程中執(zhí)行th.join)方法,則當(dāng)前線程暫停運行,等待另一線程th運行結(jié)束,才恢復(fù)到可運行狀態(tài)。
(4)interrupt(),調(diào)用該方法可使線程從阻塞狀態(tài)中恢復(fù)。
(5)currentThread(),該方法是靜態(tài)方法,用于返回當(dāng)前線程的引用。
(6)isAlive(),用于判斷線程時候還處于活動狀態(tài)。
(7)stop(),強行終止線程。
(8)suspend()和resume(),前者用于暫停一個線程,后者用于恢復(fù)該線程。
8.4線程的同步
考點:6
對象的加鎖及其操作
多線程并發(fā)操作時,由于各線程對共享數(shù)據(jù)的操作順序不同,會影響程序的執(zhí)行結(jié)果,因此Java語言使傳統(tǒng)的加鎖技術(shù)對共享數(shù)據(jù)的操作進行并發(fā)控制。
1.對象加鎖及其操作
臨界區(qū)是指程序中的一個代碼段,在這段代碼中,單獨并發(fā)的線程對同一個對象進行訪問。在Java中,用關(guān)鍵字“synchronized”標(biāo)識一個臨界區(qū)。
對象鎖是指Java為synchronized(Object)語句指定的對象進行加鎖,對象鎖是獨占排他鎖。
2.對象加鎖的注意事項
使用對象鎖需要注意如下幾點:
(1)釋放對象鎖的情況:synchronized()語句塊執(zhí)行完,synchronized()語句塊出現(xiàn)異常、持有鎖的線程調(diào)用該對象的wait()方法。
(2)所有被訪問的共享數(shù)據(jù)及訪問代碼都必須作為臨界區(qū),用synchronized加鎖。

