Java 實(shí)用程序的設(shè)第10章 Java線程

上傳人:仙*** 文檔編號(hào):47409107 上傳時(shí)間:2021-12-20 格式:PPT 頁(yè)數(shù):50 大?。?35.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
Java 實(shí)用程序的設(shè)第10章 Java線程_第1頁(yè)
第1頁(yè) / 共50頁(yè)
Java 實(shí)用程序的設(shè)第10章 Java線程_第2頁(yè)
第2頁(yè) / 共50頁(yè)
Java 實(shí)用程序的設(shè)第10章 Java線程_第3頁(yè)
第3頁(yè) / 共50頁(yè)

下載文檔到電腦,查找使用更方便

10 積分

下載資源

還剩頁(yè)未讀,繼續(xù)閱讀

資源描述:

《Java 實(shí)用程序的設(shè)第10章 Java線程》由會(huì)員分享,可在線閱讀,更多相關(guān)《Java 實(shí)用程序的設(shè)第10章 Java線程(50頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。

1、1 1第 10 章 Java 線程第第 10 10 章章 Java Java 線程線程10.1 并發(fā)的基本思想10.2 Java的基本線程機(jī)制10.3 資源共享與同步10.4 線程狀態(tài)與生命周期10.5 多線程與I/O:管道流2 2第 10 章 Java 線程10.1 并發(fā)的基本思想在深入多線程程序設(shè)計(jì)之前,讀者需要了解并發(fā)的基本思想和動(dòng)機(jī)。并發(fā)的第一個(gè)動(dòng)機(jī)在一些操作系統(tǒng)原理書(shū)籍中經(jīng)常被提及,即并發(fā)能夠?yàn)閱翁幚砥魃系某绦蛱峁┬阅艿奶嵘?。表面上看,單處理器上運(yùn)行并發(fā)程序引入了上下文切換的開(kāi)銷(xiāo),似乎應(yīng)比同樣功能的順序程序執(zhí)行得慢。但在實(shí)際系統(tǒng)中存在阻塞的情況。也就是說(shuō),程序中的某個(gè)任務(wù)可能會(huì)被程序

2、控制范圍外的某些條件(如輸入/輸出)阻塞而不能繼續(xù)執(zhí)行。 3 3第 10 章 Java 線程10.2 Java的基本線程機(jī)制一個(gè)線程是在進(jìn)程中的一個(gè)單一的順序執(zhí)行流。每一個(gè)線程都能夠驅(qū)動(dòng)一個(gè)獨(dú)立的子任務(wù)。CPU會(huì)為每個(gè)任務(wù)分配其占用CPU的時(shí)間,程序不需要知道CPU的數(shù)量及它所占用的CPU時(shí)間。Java的線程模型可以看做是CPU、代碼和數(shù)據(jù)的封裝體。線程模型的CPU可以看做是線程在占用CPU時(shí)CPU的狀態(tài);代碼即CPU所執(zhí)行的代碼,可以由多個(gè)線程共享;數(shù)據(jù)包括線程獨(dú)有數(shù)據(jù)(程序計(jì)數(shù)器、棧)和共享數(shù)據(jù)(如堆上的對(duì)象)。 4 4第 10 章 Java 線程1. 創(chuàng)建線程線程的創(chuàng)建通??梢酝ㄟ^(guò)兩種方

3、式完成:實(shí)現(xiàn)Runnable接口和繼承Thread類(lèi)。Runnable接口是java.lang包中定義的一個(gè)接口,該接口包含唯一的抽象方法run()。Thread類(lèi)則是創(chuàng)建線程的基礎(chǔ)類(lèi)。Thread類(lèi)的構(gòu)造方法可以傳入三類(lèi)參數(shù):ThreadGroup類(lèi)型的參數(shù)指明新線程所處的線程組;String類(lèi)型的參數(shù)指明新線程的名稱(chēng);Runnable接口類(lèi)型的參數(shù)所指向的對(duì)象類(lèi)型決定了線程的具體行為。 5 5第 10 章 Java 線程當(dāng)通過(guò)實(shí)現(xiàn)Runnable接口來(lái)創(chuàng)建線程時(shí),要完成以下工作:(1) 定義一個(gè)類(lèi),該類(lèi)實(shí)現(xiàn)Runnable接口,即在該類(lèi)中提供run()方法的具體實(shí)現(xiàn);(2) 將該類(lèi)的一個(gè)實(shí)

4、例對(duì)象(可稱(chēng)為任務(wù))傳遞給Thread類(lèi)的構(gòu)造方法構(gòu)造線程對(duì)象。6 6第 10 章 Java 線程7 7第 10 章 Java 線程8 8第 10 章 Java 線程當(dāng)通過(guò)繼承Thread類(lèi)的方法創(chuàng)建線程時(shí),應(yīng)通過(guò)以下兩步: (1) 從Thread類(lèi)派生出子類(lèi),并通過(guò)重寫(xiě)子類(lèi)的run()方法提供線程體; (2) 通過(guò)創(chuàng)建子類(lèi)的對(duì)象創(chuàng)建線程。9 9第 10 章 Java 線程10 10第 10 章 Java 線程11 11第 10 章 Java 線程12 12第 10 章 Java 線程13 13第 10 章 Java 線程14 14第 10 章 Java 線程2. ExecutorExecut

5、or是J2SE 5.0中引入的執(zhí)行器接口,它存在于java.util.concurrent包中。Executor可以幫助用戶(hù)管理線程對(duì)象,從而簡(jiǎn)化編程開(kāi)發(fā)。Executor將主線程與所有任務(wù)線程分隔開(kāi),能夠幫助主線程管理異步任務(wù)的執(zhí)行,主線程不再需要顯式地管理任務(wù)線程的生命周期。與傳統(tǒng)的線程創(chuàng)建方法相比,Executor是一種更優(yōu)的方式。15 15第 10 章 Java 線程16 16第 10 章 Java 線程17 17第 10 章 Java 線程3. 線程優(yōu)先級(jí)線程的優(yōu)先級(jí)將該線程的重要性傳遞給調(diào)度器。雖然CPU處理現(xiàn)有線程集合的順序是不確定的,但調(diào)度器會(huì)傾向于讓優(yōu)先級(jí)較高的線程先執(zhí)行。這

6、并不代表優(yōu)先級(jí)較低的線程將得不到執(zhí)行,但是優(yōu)先級(jí)較低的線程的執(zhí)行頻率會(huì)比較低。18 18第 10 章 Java 線程4. 睡眠sleep()與讓步y(tǒng)ield()在例10-1和例10-2中,我們都使用到了Thread類(lèi)的靜態(tài)方法sleep(),該方法能夠?qū)⒕€程的執(zhí)行暫停一段固定的時(shí)間,將CPU讓給比當(dāng)前線程優(yōu)先級(jí)更低的線程。對(duì)sleep()的調(diào)用可能拋出InterruptedException異常,因?yàn)楫惓2荒芸缇€程傳播,因此必須在run()方法中加以捕獲。19 19第 10 章 Java 線程5. 加入一個(gè)線程join()一個(gè)線程可以在另一個(gè)線程上調(diào)用join()方法。如果當(dāng)前線程在另一個(gè)線程

7、t上調(diào)用t.join(),那么當(dāng)前線程將會(huì)被掛起,直到目標(biāo)線程t結(jié)束(即t.isAlive()返回值為false)時(shí)才恢復(fù)運(yùn)行。也可向join()加入一個(gè)超時(shí)參數(shù),如果目標(biāo)線程t在這段時(shí)間內(nèi)還沒(méi)有結(jié)束,join()總是可以返回。 2020第 10 章 Java 線程例10-5 TestJoin.java:線程join()示例。21 21第 10 章 Java 線程2222第 10 章 Java 線程2323第 10 章 Java 線程6. 終止線程早期的Java版本提供stop()方法強(qiáng)行終止一個(gè)線程,該方法在終止線程時(shí)不釋放線程獲得的鎖,因而容易導(dǎo)致線程不一致,故在現(xiàn)代Java中已經(jīng)被廢止。

8、較為安全的方式是使用一個(gè)標(biāo)志,并提供方法對(duì)標(biāo)志進(jìn)行操作,標(biāo)志的值決定了是否終止某個(gè)任務(wù)。 2424第 10 章 Java 線程2525第 10 章 Java 線程2626第 10 章 Java 線程2727第 10 章 Java 線程10.3 資源共享與同步多線程機(jī)制允許我們?cè)谕粫r(shí)刻做多件事情,假設(shè)這些事情之間沒(méi)有干涉,那么也不會(huì)有什么問(wèn)題。但很多情況下,多個(gè)線程會(huì)共享一些資源或數(shù)據(jù),當(dāng)多個(gè)線程同時(shí)操作這一資源或數(shù)據(jù)時(shí),線程運(yùn)行順序的不確定性會(huì)導(dǎo)致共享資源或數(shù)據(jù)的結(jié)果產(chǎn)生不確定性,共享數(shù)據(jù)的一致性可能被破壞。因此,在多線程機(jī)制中,必須考慮對(duì)線程進(jìn)行同步,以防止此類(lèi)不一致的情況發(fā)生。2828第

9、 10 章 Java 線程1. 資源訪問(wèn)沖突在例10-6的AddAccount類(lèi)中,我們定義了一個(gè)由多個(gè)線程共享操作的靜態(tài)Account類(lèi)型的成員變量account,在main()方法中,通過(guò)并發(fā)執(zhí)行100個(gè)Task任務(wù)對(duì)account進(jìn)行操作,每個(gè)任務(wù)的操作都會(huì)試圖通過(guò)調(diào)用deposit()方法將account中具體的balance值加1。如果這100個(gè)線程依次執(zhí)行,那么最終的balance值將是100。但實(shí)際上每次運(yùn)行得到的balance值都不相同(72,74,99,68,),這實(shí)際上是由線程的具體步驟的執(zhí)行順序不確定導(dǎo)致的。2929第 10 章 Java 線程3030第 10 章 Jav

10、a 線程31 31第 10 章 Java 線程3232第 10 章 Java 線程2. synchronized關(guān)鍵字與臨界區(qū)為了解決線程不同步所導(dǎo)致的問(wèn)題,大多數(shù)并發(fā)模式都采用序列化訪問(wèn)共享資源的方案,即在給定時(shí)刻僅允許一個(gè)任務(wù)訪問(wèn)共享資源。在訪問(wèn)共享資源的代碼前面加上一條鎖語(yǔ)句,使得在每一特定時(shí)刻最多只有一個(gè)任務(wù)可以訪問(wèn)共享資源。3333第 10 章 Java 線程3434第 10 章 Java 線程3535第 10 章 Java 線程從本質(zhì)上講,對(duì)方法進(jìn)行synchronized標(biāo)記與對(duì)一般代碼片段的標(biāo)記是一致的,總可以將 public synchronized void mtd() /

11、*方法體*/ 轉(zhuǎn)化為 public void mtd() synchronized(this) /*方法體*/ 3636第 10 章 Java 線程3737第 10 章 Java 線程3. 死鎖的控制如果多個(gè)線程需要在多個(gè)共享對(duì)象上獲得鎖,那么就有可能導(dǎo)致死鎖。假定存在兩個(gè)共享對(duì)象r1和r2,t1已經(jīng)獲得r1的鎖且正在申請(qǐng)r2的鎖,同時(shí),t2已經(jīng)獲得r2的鎖且正在申請(qǐng)r1的鎖,這時(shí),程序狀態(tài)類(lèi)似于表10-3所示的兩個(gè)線程均執(zhí)行到第2行。由于每個(gè)線程都在等待另一個(gè)線程釋放其所占有的對(duì)象鎖,而同時(shí)又不會(huì)主動(dòng)釋放自己占有的對(duì)象鎖,因此這兩個(gè)線程均無(wú)法繼續(xù)執(zhí)行,形成死鎖的狀態(tài)。3838第 10 章 J

12、ava 線程3939第 10 章 Java 線程4. 線程的協(xié)作前文已經(jīng)介紹了如何使用synchronized關(guān)鍵字讓多個(gè)線程同步以避免競(jìng)爭(zhēng)狀態(tài)的發(fā)生,但有些時(shí)候,多個(gè)線程之間不僅需要同步使用共享數(shù)據(jù),還需要進(jìn)行某種協(xié)作共同完成一個(gè)功能。一種典型的協(xié)作方式是使用共享資源的wait()和notify()方法:對(duì)于共享資源R,線程調(diào)用R.wait()方法能夠釋放自己對(duì)R的鎖占用,并將自己置于R的等待隊(duì)列中,等待外部線程調(diào)用R.notify()或R.notifyAll()方法通知自己可以申請(qǐng)R的鎖;當(dāng)線程調(diào)用R.notify()方法或R.notifyAll()方法時(shí),當(dāng)前位于R的等待隊(duì)列中的某個(gè)(或

13、所有)線程會(huì)被置為可運(yùn)行狀態(tài),并開(kāi)始申請(qǐng)R的鎖。4040第 10 章 Java 線程41 41第 10 章 Java 線程4242第 10 章 Java 線程4343第 10 章 Java 線程10.4 線程狀態(tài)與生命周期一個(gè)線程可以處于5種狀態(tài),如圖10-1所示,其狀態(tài)含義及狀態(tài)轉(zhuǎn)換過(guò)程簡(jiǎn)述如下。4444第 10 章 Java 線程圖10-1 線程的狀態(tài)與生命周期4545第 10 章 Java 線程 10.5 多線程與I/O:管道流管道流作為一種流式I/O方式,主要用于實(shí)現(xiàn)線程之間數(shù)據(jù)的直接傳輸。與其他I/O流類(lèi)似地,管道流也分為管道輸入流PipedReader/PipedInputStre

14、am和管道輸出流PipedWriter/ PipedOutputStream。 4646第 10 章 Java 線程管道流的創(chuàng)建是將管道輸入流與管道輸出流相連接,例如:PipedInputStream pin=new PipedInputStream();PipedOutputStream pout=new PipedOutputStream(pin);或 PipedInputStream pin=new PipedInputStream();PipedOutputStream pout=new PipedOutputStream();pin.connect(pout);/或pout.connect(pin);4747第 10 章 Java 線程4848第 10 章 Java 線程4949第 10 章 Java 線程5050第 10 章 Java 線程在例10-11中,創(chuàng)建兩個(gè)線程分別執(zhí)行Sender任務(wù)和Receiver任務(wù)。Sender任務(wù)包含一個(gè)PipedWriter對(duì)象,Receiver任務(wù)包含一個(gè)PipedReader對(duì)象,在Receiver的構(gòu)造方法中將二者掛接在一起。Sender任務(wù)在執(zhí)行過(guò)程中每次輸出一句“hello”到管道流,而Receiver任務(wù)在執(zhí)行過(guò)程中逐字符地從管道流中讀出數(shù)據(jù)并在控制臺(tái)輸出。

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

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號(hào):ICP2024067431號(hào)-1 川公網(wǎng)安備51140202000466號(hào)


本站為文檔C2C交易模式,即用戶(hù)上傳的文檔直接被用戶(hù)下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請(qǐng)立即通知裝配圖網(wǎng),我們立即給予刪除!