電工與電子技術(shù)電子商務(wù)電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07ppt_第1頁(yè)
電工與電子技術(shù)電子商務(wù)電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07ppt_第2頁(yè)
電工與電子技術(shù)電子商務(wù)電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07ppt_第3頁(yè)
電工與電子技術(shù)電子商務(wù)電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07ppt_第4頁(yè)
電工與電子技術(shù)電子商務(wù)電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07ppt_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、電子課件JAVA語(yǔ)言程序設(shè)計(jì)java07第7章多線程7.1并發(fā)性、線程與多線程7.2獲得線程體的兩種方法7.3線程調(diào)度本章目錄7.1并發(fā)性、線程與多線程一、并發(fā)性的概念目前的計(jì)算機(jī)操作系統(tǒng)大多支持并發(fā)性,即多個(gè)進(jìn)程是交叉執(zhí)行的,一般稱多進(jìn)程為系統(tǒng)級(jí)并發(fā)。Java語(yǔ)言通過(guò)程序控制流來(lái)執(zhí)行程序,單個(gè)的一段程序執(zhí)行控制流稱為線程。多線程指的是在單個(gè)程序內(nèi)部可以同時(shí)運(yùn)行多個(gè)相同或不同的線程來(lái)執(zhí)行不同的任務(wù)。線程與操作系統(tǒng)中的進(jìn)程有些類似,在同一時(shí)刻操作系統(tǒng)中可以運(yùn)行多個(gè)進(jìn)程,但是線程則更進(jìn)一步,將并發(fā)推進(jìn)到語(yǔ)言級(jí),所以說(shuō)Java語(yǔ)言支持語(yǔ)言級(jí)并發(fā)。在單個(gè)程序內(nèi)部也可以在同一時(shí)刻有多個(gè)線程在進(jìn)行不同的運(yùn)

2、算。多線程也需要系統(tǒng)通過(guò)分配處理器的運(yùn)行時(shí)間進(jìn)行調(diào)度以提高整個(gè)程序的運(yùn)行效率。二、線程的狀態(tài)與生命周期一個(gè)線程在其生命生存時(shí)段內(nèi)的任一時(shí)刻都處于某一種線程狀態(tài),線程在從其生命開始到結(jié)束的時(shí)間內(nèi)將可能經(jīng)歷從出生態(tài)到死亡態(tài)的多種狀態(tài),這構(gòu)成了它的生命周期。線程的狀態(tài)包括以下7種:出生態(tài)(Born state),也稱為新線程(New Thread)。就緒態(tài)(Ready state),也稱為可運(yùn)行線程(Runnable Thread)。運(yùn)行態(tài)(Running state)。休眠態(tài)(Sleeping state)。等待態(tài)(Waiting state)。阻塞態(tài)(Blocked state)。死亡態(tài)(Dea

3、d state)。特別的線程關(guān)系:某個(gè)線程只有在另一個(gè)線程終止時(shí),才能繼續(xù)執(zhí)行,這種線程稱為依賴線程。此時(shí)依賴線程可以調(diào)用另一個(gè)線程的join()方法。當(dāng)另一個(gè)線程轉(zhuǎn)化為死亡態(tài)時(shí),依賴線程會(huì)脫離等待態(tài)而轉(zhuǎn)化為就緒態(tài)。在一個(gè)系統(tǒng)中,任何時(shí)刻最多都只能有一個(gè)運(yùn)行態(tài)線程。出生態(tài)就緒態(tài)阻塞態(tài)死亡態(tài)運(yùn)行態(tài)休眠態(tài)等待態(tài)start()獲得處理器yield()完成任務(wù)或終止等待任務(wù)wait()sleep()任務(wù)完成interrupt()休眠時(shí)間到interrupt()等待時(shí)間到interrupt()notify()notifyall()線程生命周期中的狀態(tài)轉(zhuǎn)化示意圖7.2獲得線程體的兩種方法一、Thread類

4、和Runnable接口線程從根本上講是一段程序代碼序列,還需要在程序中實(shí)現(xiàn)。java.lang包中定義了Thread類,是Java語(yǔ)言多線程程序設(shè)計(jì)的基礎(chǔ)和關(guān)鍵。Thread類是java.lang.Object類的直接子類,其中定義的一些方法成員完成與線程有關(guān)的操作:interrupt() /中斷線程join() /等待該線程終止join(long millis) /等待該線程終止,在指定的毫秒數(shù)內(nèi)join(long millis, int nanos) /等待該線程終止,在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)sleep(long millis) /休眠當(dāng)前正在執(zhí)行的線程,在指定的毫秒數(shù)內(nèi)sleep(

5、long millis, int nanos) /休眠當(dāng)前正在執(zhí)行的線程,在指定的毫秒數(shù)加指定的納秒數(shù)內(nèi)start() /使該線程開始執(zhí)行yield() /暫停當(dāng)前正在執(zhí)行的線程,并執(zhí)行其他線程notify() /喚醒在此對(duì)象監(jiān)視器上等待的單個(gè)線程notifyAll() /喚醒在此對(duì)象監(jiān)視器上等待的所有線程wait() /導(dǎo)致當(dāng)前的線程等待wait(long timeout) /導(dǎo)致當(dāng)前的線程等待timeout毫秒wait(long timeout, int nanos) /導(dǎo)致當(dāng)前的線程等待timeout毫秒加nanos納秒isAlive() /測(cè)試線程是否處于活動(dòng)狀態(tài)isInterrupt

6、ed() /測(cè)試線程是否已經(jīng)中斷getPriority() /返回線程的優(yōu)先級(jí)getId() /返回線程的標(biāo)識(shí)符getName() /返回線程的名稱getState() /返回線程的狀態(tài)setPriority(int newPriority) /更改線程的優(yōu)先級(jí)setName(String name) /改變線程名稱,使之與參數(shù)name相同在java.lang包中還定義了Runnable接口,其中只有一個(gè)run()方法,這個(gè)run()方法的作用與Thread類中的run()方法在定義線程體時(shí)的作用是一樣的。Java語(yǔ)言支持多線程,線程在Application程序和Applet程序中都可以使用,

7、在Applet中使用得更普遍一些。線程的行為由線程體確定,線程體是線程的主體,含有線程的具體內(nèi)容。Java語(yǔ)言程序中實(shí)現(xiàn)線程的程序設(shè)計(jì)的關(guān)鍵是使主程序獲得run()方法并重寫run()方法,重寫了run()方法也就定義了線程體。根據(jù)獲得run()方法的途徑不同,定義線程體有兩種完全等價(jià)的方式。二、通過(guò)繼承Thread類獲得線程體在java.lang.Thread類中定義有run()方法,可以在當(dāng)前程序中通過(guò)繼承Thread類間接繼承run()方法,并在程序中重寫該方法而構(gòu)造出線程體。三、通過(guò)實(shí)現(xiàn)Runnable接口獲得線程體由于Java語(yǔ)言不支持多重繼承,因此如果用來(lái)獲得線程體的類已經(jīng)繼承了其

8、他的類,這個(gè)方法在使用中就會(huì)受限制??梢栽诋?dāng)前程序中實(shí)現(xiàn)Runnable接口并重寫run()方法,從而構(gòu)造出線程體。這種方法比較多見(jiàn)于編寫Applet程序,當(dāng)一個(gè)Applet程序的線程體必須要在主類中實(shí)現(xiàn)的時(shí)候,就別無(wú)選擇地要使用實(shí)現(xiàn)Runnable接口的方法,與前一種方法相比,這種方法的效果是一樣的。多個(gè)線程同時(shí)在一個(gè)程序中執(zhí)行,要通過(guò)系統(tǒng)的線程調(diào)度獲得處理器才能執(zhí)行,所以完全可能出現(xiàn)一個(gè)線程還沒(méi)有執(zhí)行完就被迫停下來(lái)而由另一個(gè)線程取而代之獲得處理器的情況,所以就會(huì)出現(xiàn)同一個(gè)線程所執(zhí)行的內(nèi)容的順序是固定的,而多個(gè)線程的執(zhí)行內(nèi)容的順序就可能出現(xiàn)不同的組合的結(jié)果,這種現(xiàn)象稱為線程的不確定性。7.3

9、線程調(diào)度一、線程的優(yōu)先級(jí)每個(gè)線程都有自己的優(yōu)先級(jí)。當(dāng)Java線程被創(chuàng)建時(shí),該線程從父線程中繼承優(yōu)先級(jí)并保持一致。線程被創(chuàng)建后,可以改變線程的優(yōu)先級(jí)。線程的優(yōu)先級(jí)定義為10級(jí),分別用數(shù)字1到10表示。在Thread類中還定義了幾個(gè)描述線程的優(yōu)先級(jí)的字段:最高優(yōu)先級(jí)MAX_PRIORITY對(duì)應(yīng)10級(jí),默認(rèn)優(yōu)先級(jí)NORM_PRIORITY對(duì)應(yīng)5級(jí),最低優(yōu)先級(jí)MIN_PRIORITY對(duì)應(yīng)1級(jí)。線程的優(yōu)先級(jí)的作用是方便操作系統(tǒng)調(diào)度線程,操作系統(tǒng)總是讓優(yōu)先級(jí)高的線程先于優(yōu)先級(jí)低的線程執(zhí)行。對(duì)于優(yōu)先級(jí)相同的線程,在不采用分時(shí)技術(shù)的操作系統(tǒng)中總是讓一個(gè)線程一直運(yùn)行直到完成任務(wù),除非它自己轉(zhuǎn)化為休眠態(tài)、等待態(tài)或

10、阻塞態(tài);在采用分時(shí)技術(shù)的操作系統(tǒng)中每個(gè)線程都將獲得稱為時(shí)間片的處理器運(yùn)行時(shí)間以使線程能夠運(yùn)行??梢酝ㄟ^(guò)調(diào)用Thread類的getPriority()方法獲取線程的優(yōu)先級(jí),setPriority()方法更改線程的優(yōu)先級(jí)。二、線程同步線程在訪問(wèn)共享對(duì)象時(shí)不允許其它線程訪問(wèn)該對(duì)象的情況稱為線程互斥或線程同步。線程同步與計(jì)算機(jī)操作系統(tǒng)中的進(jìn)程同步很相似。Java語(yǔ)言采用監(jiān)控器機(jī)制來(lái)實(shí)現(xiàn)線程同步,監(jiān)控器機(jī)制也稱為獲得鎖。在Java語(yǔ)言中為每個(gè)對(duì)象都設(shè)置了一個(gè)監(jiān)控器,監(jiān)控器每次只允許一個(gè)線程來(lái)執(zhí)行對(duì)象的同步語(yǔ)句,當(dāng)程序控制流進(jìn)入同步語(yǔ)句時(shí),將對(duì)象鎖住,從而實(shí)現(xiàn)線程同步。任意一個(gè)時(shí)刻如果有多條語(yǔ)句試圖使對(duì)象

11、同步則只能有一條同步語(yǔ)句被激活,其它所有試圖對(duì)同一對(duì)象實(shí)現(xiàn)同步的線程都將被迫處于阻塞態(tài)。當(dāng)實(shí)現(xiàn)線程同步的語(yǔ)句完成執(zhí)行過(guò)程之后,監(jiān)控器才會(huì)打開對(duì)象的鎖并按照線程調(diào)度原則處理其它的同步語(yǔ)句,分配處理器時(shí)間。在Java語(yǔ)言程序設(shè)計(jì)中,可以采用“synchronized”關(guān)鍵字實(shí)現(xiàn)同步方法,具體用法就是在程序中進(jìn)行方法定義時(shí)用“synchronized”關(guān)鍵字說(shuō)明方法,使得方法具有同步屬性,任一時(shí)刻只有一個(gè)線程能夠調(diào)用帶有同步屬性的方法。還可以在程序中使用wait()方法使一個(gè)暫時(shí)沒(méi)有獲得完全的條件,無(wú)法對(duì)該對(duì)象繼續(xù)執(zhí)行任務(wù)的線程進(jìn)入等待態(tài)。當(dāng)一個(gè)線程完成了自己的同步語(yǔ)句并執(zhí)行完自己的代碼使得其它的線

12、程所等待的條件得以滿足之后,也可以通過(guò)使用notify()方法將一個(gè)正處于等待態(tài)的線程再次轉(zhuǎn)為就緒態(tài)。也可以通過(guò)使用notifyAll()方法將所有處于等待態(tài)的線程再次轉(zhuǎn)為就緒態(tài)。轉(zhuǎn)為就緒態(tài)的線程都有機(jī)會(huì)獲得對(duì)象的鎖,但是任一時(shí)刻最多只能有一個(gè)線程獲得對(duì)象的鎖,其余的線程都將處于阻塞態(tài)。有幾個(gè)問(wèn)題是在編寫線程同步程序時(shí)應(yīng)該注意的:當(dāng)對(duì)象的鎖被釋放時(shí),阻塞線程調(diào)用一個(gè)用“synchronized”關(guān)鍵字說(shuō)明的方法并不保證一定就能立刻成為下一個(gè)獲得鎖的線程。調(diào)用了監(jiān)控器的wait()方法成為等待態(tài)的線程經(jīng)由其它線程調(diào)用notify()方法之后并不保證一定會(huì)脫離等待態(tài)。在同步方法中建議在wait()方法之前調(diào)用notifyAll()方法喚醒所有等待態(tài)線程,包括該線程自身,而將同步線程

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論