等級(jí)考試二級(jí)JAVA考點(diǎn)分析之線程與對(duì)象串行化

字號(hào):

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