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

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

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

10 積分

下載資源

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

資源描述:

《Java 實用程序的設(shè)第10章 Java線程》由會員分享,可在線閱讀,更多相關(guān)《Java 實用程序的設(shè)第10章 Java線程(50頁珍藏版)》請在裝配圖網(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è)計之前,讀者需要了解并發(fā)的基本思想和動機(jī)。并發(fā)的第一個動機(jī)在一些操作系統(tǒng)原理書籍中經(jīng)常被提及,即并發(fā)能夠為單處理器上的程序提供性能的提升。表面上看,單處理器上運行并發(fā)程序引入了上下文切換的開銷,似乎應(yīng)比同樣功能的順序程序執(zhí)行得慢。但在實際系統(tǒng)中存在阻塞的情況。也就是說,程序中的某個任務(wù)可能會被程序

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

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

4、例對象(可稱為任務(wù))傳遞給Thread類的構(gòu)造方法構(gòu)造線程對象。6 6第 10 章 Java 線程7 7第 10 章 Java 線程8 8第 10 章 Java 線程當(dāng)通過繼承Thread類的方法創(chuàng)建線程時,應(yīng)通過以下兩步: (1) 從Thread類派生出子類,并通過重寫子類的run()方法提供線程體; (2) 通過創(chuàng)建子類的對象創(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可以幫助用戶管理線程對象,從而簡化編程開發(fā)。Executor將主線程與所有任務(wù)線程分隔開,能夠幫助主線程管理異步任務(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)先級線程的優(yōu)先級將該線程的重要性傳遞給調(diào)度器。雖然CPU處理現(xiàn)有線程集合的順序是不確定的,但調(diào)度器會傾向于讓優(yōu)先級較高的線程先執(zhí)行。這

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

7、t上調(diào)用t.join(),那么當(dāng)前線程將會被掛起,直到目標(biāo)線程t結(jié)束(即t.isAlive()返回值為false)時才恢復(fù)運行。也可向join()加入一個超時參數(shù),如果目標(biāo)線程t在這段時間內(nè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)行終止一個線程,該方法在終止線程時不釋放線程獲得的鎖,因而容易導(dǎo)致線程不一致,故在現(xiàn)代Java中已經(jīng)被廢止。

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

9、 10 章 Java 線程1. 資源訪問沖突在例10-6的AddAccount類中,我們定義了一個由多個線程共享操作的靜態(tài)Account類型的成員變量account,在main()方法中,通過并發(fā)執(zhí)行100個Task任務(wù)對account進(jìn)行操作,每個任務(wù)的操作都會試圖通過調(diào)用deposit()方法將account中具體的balance值加1。如果這100個線程依次執(zhí)行,那么最終的balance值將是100。但實際上每次運行得到的balance值都不相同(72,74,99,68,),這實際上是由線程的具體步驟的執(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)致的問題,大多數(shù)并發(fā)模式都采用序列化訪問共享資源的方案,即在給定時刻僅允許一個任務(wù)訪問共享資源。在訪問共享資源的代碼前面加上一條鎖語句,使得在每一特定時刻最多只有一個任務(wù)可以訪問共享資源。3333第 10 章 Java 線程3434第 10 章 Java 線程3535第 10 章 Java 線程從本質(zhì)上講,對方法進(jìn)行synchronized標(biāo)記與對一般代碼片段的標(biāo)記是一致的,總可以將 public synchronized void mtd() /

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

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

13、所有)線程會被置為可運行狀態(tài),并開始申請R的鎖。4040第 10 章 Java 線程41 41第 10 章 Java 線程4242第 10 章 Java 線程4343第 10 章 Java 線程10.4 線程狀態(tài)與生命周期一個線程可以處于5種狀態(tài),如圖10-1所示,其狀態(tài)含義及狀態(tài)轉(zhuǎn)換過程簡述如下。4444第 10 章 Java 線程圖10-1 線程的狀態(tài)與生命周期4545第 10 章 Java 線程 10.5 多線程與I/O:管道流管道流作為一種流式I/O方式,主要用于實現(xiàn)線程之間數(shù)據(jù)的直接傳輸。與其他I/O流類似地,管道流也分為管道輸入流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)建兩個線程分別執(zhí)行Sender任務(wù)和Receiver任務(wù)。Sender任務(wù)包含一個PipedWriter對象,Receiver任務(wù)包含一個PipedReader對象,在Receiver的構(gòu)造方法中將二者掛接在一起。Sender任務(wù)在執(zhí)行過程中每次輸出一句“hello”到管道流,而Receiver任務(wù)在執(zhí)行過程中逐字符地從管道流中讀出數(shù)據(jù)并在控制臺輸出。

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

相關(guān)資源

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

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

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


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