第八章異常處理與多線程_第1頁(yè)
第八章異常處理與多線程_第2頁(yè)
第八章異常處理與多線程_第3頁(yè)
第八章異常處理與多線程_第4頁(yè)
第八章異常處理與多線程_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第八章 異常處理與多線程8.1 異常就是Java程序在運(yùn)行過程中出錯(cuò), 異常終止的情況.可能導(dǎo)致異常發(fā)生的原因有許多,如數(shù)組下標(biāo)越界,空指針訪問,試圖讀取不存在的文件,網(wǎng)絡(luò)連接中斷等.(1)錯(cuò)誤(Error) - JVM系統(tǒng)內(nèi)部錯(cuò)誤,資源耗盡,內(nèi)存溢出的嚴(yán)重情況,程序員無能為力,只能讓程序終止.(2)違例(Exception) - 編程錯(cuò)誤或偶然外在因素導(dǎo)致的一般性錯(cuò)誤.如對(duì)負(fù)數(shù)開方, 空指針訪問,試圖讀取不存在的文件,網(wǎng)絡(luò)連接中斷.Exception可預(yù)先預(yù)防.Java異常類層次關(guān)系圖(1)運(yùn)行時(shí)異常(RuntimeException)是因程序員設(shè)計(jì)或?qū)崿F(xiàn)方式不當(dāng)造成的.如果事先檢查數(shù)組元素

2、下標(biāo)不超出數(shù)組長(zhǎng)度,異常就不會(huì)拋出.(2)非運(yùn)行時(shí)異常 1(Non-RuntimeException)-由編譯器編譯時(shí)發(fā)生的異常,而不是程序本身的錯(cuò)誤,如IOException有時(shí)是環(huán)境造成的,如文件未找到或URL無效等.異常處理Java有兩種方式:(1) 使用 trycatch.finally語(yǔ)句捕獲并處理異常對(duì)象,其中finally語(yǔ)句可省略. 通常將可能發(fā)生異常的語(yǔ)句放在try語(yǔ)句中.(2) 不需處理它生成的異常,而是向上傳遞,由調(diào)用它的方法來處理,使用throws語(yǔ)句聲明它可以拋出的異常,而不捕捉它們.(1) j3_28.java 使用 trycatch.finally語(yǔ)句捕獲數(shù)組下標(biāo)

3、越界異常并處理異(2)ExceptionTest3.java -非運(yùn)行時(shí)異常(編譯器編譯時(shí)發(fā)生的異常-Java編譯器從語(yǔ)法上要求對(duì)異常事件做出處理,否則不能通過編譯)例如:ExceptionTest3.java - 不能通過編譯,改正為ExceptionTest4.java就可編 2ExceptionTest4.java -(文件不存-非運(yùn)行時(shí)異常)- (使用 trycatch.finally(3) j3_29.java 使用throws語(yǔ)句聲明拋出異常對(duì)象給調(diào)用方用的catch()方8.2 多線程 (java中引入多線程機(jī)制的目的在于實(shí)現(xiàn)多任務(wù),以提高程序利用CPU的效率.主要通過多線程之間

4、共享代碼和數(shù)據(jù)來實(shí)現(xiàn)的.)多線程是根據(jù)多任務(wù)的原理,在一個(gè)程序內(nèi)部實(shí)現(xiàn)多個(gè)任務(wù)(順序控制流)的并發(fā)執(zhí)行.其中的每個(gè)任務(wù)被稱為線程(Thread), 線程是一個(gè)程序內(nèi)部的順序控制流.(1)進(jìn)程 執(zhí)行一個(gè)程序的過程(包括分配內(nèi)存外設(shè)等資源等侯處理器的執(zhí)行程序中的指令程序執(zhí)行完后系統(tǒng)回收所分配資源的過程),每個(gè)進(jìn)程有自己的內(nèi)存空間和資源進(jìn)程之間不會(huì)共享系統(tǒng)資源,進(jìn)程切換開銷大。(2)線程 - 線程是比進(jìn)程更小的運(yùn)行單位,一個(gè)進(jìn)程可劃分成多個(gè)線程。線程由操作系統(tǒng)調(diào)度獨(dú)立執(zhí)行控制,和進(jìn)程的區(qū)別是沒有獨(dú)立的存儲(chǔ)空間,而是和所屬進(jìn)程的其它線程共享一個(gè)存儲(chǔ)空間,即共享進(jìn)程資源,所以線程之間數(shù)據(jù)通信交換比進(jìn)程切

5、換快。(3)每個(gè)Java程序都有一個(gè)默認(rèn)主線程,這個(gè)主線程從main方法開始并負(fù)責(zé)執(zhí)行main方法。在main方法的執(zhí)行中再創(chuàng)建的線程稱為其他線程,如果main方法的執(zhí)行中沒有創(chuàng)建其他線程,那么main方法執(zhí)行完最后一條語(yǔ)句,及main方法返回時(shí),JVM就會(huì)結(jié)束Java應(yīng)用程序,如果main方法中再創(chuàng)建了其他線程,那么JVM就會(huì)在主線程和其他線程之間輪流切換,保證每個(gè)線程都有機(jī)會(huì)使用CPU,直到JVM執(zhí)行完所有線程才會(huì)結(jié)束Java應(yīng)用程序。因此通過多線程技術(shù)可提高CPU的使用效率和多程序的并發(fā)執(zhí)行,完成多任務(wù)。(4)線程隨著程序的運(yùn)行而產(chǎn)生, 隨著程序的結(jié)束而消亡.每個(gè)線程都存在一個(gè)從新建,運(yùn)

6、行到死亡的生命周期.在生命周期中,一個(gè)線程具有新建,就緒, 運(yùn)行, 阻塞和終止5種狀態(tài)。8.3 線程的基本概念每個(gè)線程都是通過某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run( )來完成其操作的, 方法run( )稱為線程體.8.4 線程實(shí)現(xiàn)的兩種方法(1) 使用Thread類的子類方法創(chuàng)建線程步驟1. 定義一個(gè)類繼承Thread類,重寫Thread類中的run( )方法2. 創(chuàng)建該Thread子類的對(duì)象3. 調(diào)用該對(duì)象的start( )方法時(shí), run( )方法將被自動(dòng)調(diào)用,線程啟動(dòng).此方法直接繼承Thread類創(chuàng)建線程時(shí), Thread類的子類Runner3無法從其他類繼承, run( )方法的

7、當(dāng)前對(duì)象就是線程對(duì)象,可直接操縱. 這種方法簡(jiǎn)單. java中只允許單繼承,限制了類的自由,浪費(fèi)了類的資源,因此采用繼承Thread類來創(chuàng)建線程不是最好的方法.(2) 實(shí)現(xiàn)Runnable接口創(chuàng)建多線程步驟運(yùn)行線程的另一種方法是實(shí)現(xiàn)Runnable接口,然后生成運(yùn)行這個(gè)類的線程即可. Runnable接口是定義在java.lang包中的一個(gè)接口,其中只提供了一個(gè)抽象的run( ) 方法,即線程體.1. 定義一個(gè)類實(shí)現(xiàn)Runnable接口,重寫其中的run( )方法.2. 創(chuàng)建Runnable接口實(shí)現(xiàn)類的對(duì)象.3. 創(chuàng)建該Thread類的對(duì)象(以先前Runnable類型對(duì)象為構(gòu)造方法實(shí)參)4.

8、調(diào)用Thread對(duì)象的start( )方法時(shí), run( )方法將被自動(dòng)調(diào)用,啟動(dòng)線程.在本例中創(chuàng)建了兩個(gè)新線程t1, t2,它們共享Runner2()類中的run( )方法,同時(shí)也共享創(chuàng)建Runnable接口實(shí)現(xiàn)類的對(duì)象r, 兩個(gè)線程t1, t2在運(yùn)行中分別操縱對(duì)象r調(diào)用其重寫run( )方法.其結(jié)果線程t1, t2作為獨(dú)立的順序控制流,并發(fā)地交替執(zhí)行,如果線程t1因某種原因處于阻塞狀態(tài),如等待用戶鍵盤輸入,CPU會(huì)立即轉(zhuǎn)到線程t2執(zhí)行,依此類推,而不必空置CPU.使用Runnable接口創(chuàng)建線程時(shí),可以將CPU,代碼和數(shù)據(jù)分開,形成清晰的模型. 線程體.run( ) 方法所在的類還可從其它

9、類繼承一些有用的屬性和方法,保持程序風(fēng)格一致性.變量值不會(huì)影響其它線程的run()方法中的局部變量值3.8.3 線程的狀態(tài)線程隨著程序的運(yùn)行而產(chǎn)生, 隨著程序的結(jié)束而消亡.每個(gè)線程都存在一個(gè)從新建,運(yùn)行到死亡的生命周期.在線程生命周期中,一個(gè)線程具有新建,就緒, 運(yùn)行, 阻塞和終止5種狀態(tài), Thread類中的方法可以改變線程的狀態(tài).在整個(gè)生命周期中, 線程對(duì)象總是處于5種生存狀態(tài)中某一種.如圖7.4線程在5種生存狀態(tài)中轉(zhuǎn)換.(1) 新建線程(new thread)- 用new創(chuàng)建一個(gè)線程處于新建狀態(tài)。它僅是一個(gè)空對(duì)象,并未得到系統(tǒng)資源。(2) 就緒狀態(tài)(runnable )- 用start(

10、 )方法啟動(dòng)一個(gè)線程后,系統(tǒng)為該線程分配資源。此時(shí)該線程進(jìn)入線程對(duì)列排隊(duì),即線程進(jìn)入就緒狀態(tài),等待處理器執(zhí)行。(3) 運(yùn)行狀態(tài)(running )- 系統(tǒng)調(diào)度一個(gè)可運(yùn)行線程,使該線程占用處理器,執(zhí)行該線程的run( )方法,此時(shí)線程進(jìn)入運(yùn)行狀態(tài)。(4) 阻塞狀態(tài) (Not runnable)- 由于某種原因線程不能運(yùn)行,即使處理器空閑,該線程也不會(huì)執(zhí)行。如輸入輸出等待,睡眠,和鎖定等原因。只有阻塞原因被消除,該線程才進(jìn)入運(yùn)行狀態(tài),并再次進(jìn)入線程對(duì)列排隊(duì)等待處理器從上次中斷處繼續(xù)運(yùn)行。(5) 終止?fàn)顟B(tài)(dead)- 線程執(zhí)行完畢進(jìn)入終止?fàn)顟B(tài),也就是run()方法執(zhí)行完,該線程自然撤消。終止有兩個(gè)

11、原因:自然撤消或被停止。isAlive()方法可返回線程運(yùn)行狀態(tài)(是否)。3.8.4 對(duì)線程狀態(tài)的控制在對(duì)線中有若干方法改變線程狀態(tài)。(1) 使線程進(jìn)入睡眠狀態(tài)的sleep( )方法public static void sleep( long millis) throws InterruptedException millis -睡眠時(shí)間(毫秒)sleep( )方法使線程進(jìn)入睡眠狀態(tài),即不可運(yùn)行狀態(tài)時(shí)拋出一個(gè)中斷異常InterruptedException。(2) 暫停線程的yield( ) 方法yield( ) 方法暫停程序的執(zhí)行,但線程仍在可運(yùn)行狀態(tài)(就緒狀態(tài)runnable - 末進(jìn)入阻

12、塞狀態(tài))。系統(tǒng)選擇同優(yōu)先級(jí)的線程執(zhí)行,若無同優(yōu)先級(jí)的線程,則繼續(xù)執(zhí)行該線程。(3) join( ) 方法join( ) 方法使本線程暫停執(zhí)行,直到調(diào)用該方法的線程執(zhí)行結(jié)束后再繼續(xù)執(zhí)行本線程。本線程要等到調(diào)用該方法的線程結(jié)束后再繼續(xù)執(zhí)行,本書稱線程聯(lián)合。(4)wait( )和 notify( ) 方法wait( )和 notify( ) 方法是在同步(獨(dú)占)方法中使用,wait( )方法使當(dāng)前線程進(jìn)入阻塞狀態(tài),直到被另一線程喚醒。notify( ) 方法把線程狀態(tài)的改變通知對(duì)列中的其它線程,使它們進(jìn)入可運(yùn)行狀態(tài)。(5)suspend( )掛起方法和 resume( ) 恢復(fù)方法suspend(

13、)方法使當(dāng)前線程由就緒狀態(tài)(Runnable)狀態(tài)切換到阻塞狀態(tài)(Not Runnable),該線程若要回到Runnable狀態(tài),必須調(diào)用resume( ) 方法來實(shí)現(xiàn)。(6) interrupt( )中斷方法Public void interrupt( ); - 為線程設(shè)置中斷標(biāo)記,當(dāng)run()方法運(yùn)行時(shí)用isInterrupted( ) 方法檢驗(yàn)此標(biāo)記。在線程進(jìn)入休眠狀態(tài)后,如調(diào)用interrupt( ) 方法,可捕捉到一個(gè)sleep( ) 方法拋出的InterruptedException異常并中斷sleep狀態(tài)。每拋出一InterruptedException異常都會(huì)清除中斷標(biāo)記。Pu

14、blic void Boolean isInterrupted( ) ;Public static void Boolean isInterrupted( ) ;8.6 線程的優(yōu)先級(jí)調(diào)度和管理線程的優(yōu)先級(jí)是一些介于1到10的整數(shù)字的常量,它表示線程間的執(zhí)行順序。 public static final int NORM_PRIORITY=5 默認(rèn)public static final int MIN_PRIORITY=1 最低public static final int MAX_PRIORITY=10 最高設(shè)置或取得優(yōu)先級(jí)用:public final int setPriority ( )

15、public final int getPriority ( ) 方法.線程調(diào)度是根據(jù)線程的優(yōu)先級(jí)決定它的執(zhí)行,對(duì)相同優(yōu)先級(jí)的線程按分時(shí)和獨(dú)占兩種方式調(diào)度。分時(shí)按分到的時(shí)間片執(zhí)行,執(zhí)行完讓出處理器。獨(dú)占方式要執(zhí)行完才讓出處理器。幾種情況當(dāng)前線程放棄CPU(1) 調(diào)用sleep( )yield( ) 方法(2) I/O訪問外存讀寫等待輸入等操作導(dǎo)致阻塞狀態(tài)。(3) 調(diào)用wait( )方法(4) 低優(yōu)先級(jí)8.7 線程組在java中每個(gè)線程都是一個(gè)線程組的成員,線程組把多個(gè)線程集合為一個(gè)對(duì)象。可對(duì)線程組同時(shí)操作和分組來區(qū)分不同安全的線程。線程組創(chuàng)建的2個(gè)方法:public ThreadGroup(

16、String name ) - 創(chuàng)建一個(gè)名為name的線程組public ThreadGroup(ThreadGroup parent, String name ) 在線程組parent中創(chuàng)建一個(gè)名為name的線程組屬性和方法:public final String getName ( ) 方法. 返回線程組的名稱。 public final String get Parent ( ) 方法. 返回線程組的父類名。public final void getMaxPriority ( ) 返回線程組最高優(yōu)先級(jí)public final void setMaxPriority (int n ) 設(shè)置線程組最高優(yōu)先級(jí)public int activeGroup( ) - 返回線程組活動(dòng)線程數(shù)。public int enumerate(Thread list ) 將活動(dòng)線程復(fù)制到線程組中。suspend( )stop() resume( ) 方法8.8 線程同步在棧中存取數(shù)據(jù)時(shí)容易發(fā)生資源沖突因此需解決同一個(gè)數(shù)據(jù)被多個(gè)線程同時(shí)訪問的問題,實(shí)現(xiàn)在一個(gè)進(jìn)程中

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論