版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第7章多線程與異常處理,主要內(nèi)容:異常處理多線程的基本概念線程的使用方法線程同步,7.1異常處理,異常(Exception)指程序運行過程中出現(xiàn)的非正?,F(xiàn)象,例如用戶輸入錯誤、需要處理的文件不存在、在網(wǎng)絡(luò)上傳輸數(shù)據(jù)但網(wǎng)絡(luò)沒有連接等。,7.1.1Java的異常處理機制,在Java中,把異常分為錯誤(Error)與異常(Exception)兩大類。Error定義了程序中不能恢復(fù)的嚴重錯誤條件。如內(nèi)存溢出、類文件格式錯誤等。這一類錯誤由Java運行系統(tǒng)處理,不需要我們?nèi)ヌ幚?。Exception定義了程序中遇見的輕微的錯誤條件。,7.1.1Java的異常處理機制,系統(tǒng)定義的運行異常,7.1.2異常的拋
2、出,【例7-1】創(chuàng)建一個有錯誤的程序,測試異常拋出的情況。(默認情況下,系統(tǒng)自動拋出異常)1./*測試除數(shù)為0時拋出的異常*/2.classExample7_13.4.publicstaticvoidmain(Stringargs)5.6.inta=5,d=0;7.System.out.println(a/d);8.9.,7.1.3異常處理,異常處理的方法有二種:一種方法是使用trycatchfinally結(jié)構(gòu)對異常進行捕獲和處理;另一種方法是通過throws和throw拋出異常。,1.trycatchfinally結(jié)構(gòu)格式為:,try可能出現(xiàn)異常的程序代碼catch(異常類1變量1)異常類1
3、對應(yīng)的異常處理代碼catch(異常類2變量2)異常類2對應(yīng)的異常處理代碼.finally無論異常是否發(fā)生都要執(zhí)行的代碼,【例7-2】應(yīng)用異常處理修改例7-1。,classExample7_2publicstaticvoidmain(Stringargs)inta=5,b=0;trySystem.out.println(a/b);catch(Exceptione)System.out.println(“除數(shù)為0);,【例7-3】數(shù)組下標(biāo)越界引發(fā)異常,classExample7_3publicstaticvoidmain(Stringargs)inta=1,2,3,4,5;intsum=0;try
4、for(inti=0;i=5;i+)sum+=ai;System.out.println(sum=+sum);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(發(fā)生異常原因+e);finallySystem.out.println(程序運行結(jié)束);,用throw語句拋出異常對象的語法格式為:修飾符返回類型方法名()throws異常類名.thrownew異常類名();.,2、聲明拋出異常,Exception類從基類Throwable繼承的方法:StringgetMessage():取得細節(jié)消息StringgetLocalizedMe
5、ssage():取得細節(jié)消息(特定語系)StringtoString():返回Throwable的簡短描述(詳細的消息,如果有的話)voidprintStackTrace():打印出Throwable和Throwable的調(diào)用堆棧路徑ThrowablefillStackTrace():把Stack狀態(tài)記錄于Throwable,用于重擲,publicclassExceptionMethodspublicstaticvoidmain(Stringargs)trythrownewException(HeressmyException);catch(Exceptione)System.err.prin
6、tln(CaughtException);System.err.println(e.getMessage():+e.getMessage();System.err.println(e.getLocalizedMessage():+e.getLocalizedMessage();System.err.println(e.toString():+e);System.err.println(e.printStackTrace():);e.printStackTrace(System.err);,System.err:輸出錯誤信息;優(yōu)于System.out,因為把結(jié)果送到System.err,它不會隨
7、System.out一起被重定向。,輸出結(jié)果:CaughtExceptione.getMessage():HeresmyExceptione.getLocalizedMessage():HeresmyExceptione.toString():java.lang.Exception:HeresmyExceptione.printStackTrace():java.lang.Exception:HeresmyExceptionatExceptionMethods.main(ExceptionMethods.java:6),每個方法都比前一個提供了更多的信息-實際上它們每一個都是前一個的超集。,7
8、.2多線程的基本概念,7.2.1線程與進程,所謂“進程”(process),是一個獨立運行著的程序,它有自己的地址空間。線程是進程內(nèi)部的單一控制執(zhí)行流。因此一個進程內(nèi)可以具有多個并發(fā)執(zhí)行的線程。,7.2.2什么是多任務(wù)?,“多任務(wù)”(multitasking)是計算機操作系統(tǒng)同時運行幾個程序(進程)或任務(wù)的能力。嚴格地說,一個單CPU計算機在任何給定的時刻只能執(zhí)行一個任務(wù),然而操作系統(tǒng)可以在很短的時間內(nèi)在各個程序之間進行切換,這樣看起來就好象計算機在同時執(zhí)行多個程序。一個程序具備有同時執(zhí)行不同任務(wù)的能力,稱為“多線程”。,7.2.3進程與多線程的區(qū)別,在Java編程中,每實例化一個線程對象,就
9、創(chuàng)建一個虛擬的CPU,由虛擬CPU處理本線程數(shù)據(jù)。每個Java程序都有一個主線程,即由main()方法所對應(yīng)的線程。對于applet,瀏覽器即是主線程。除主線程外,線程無法自行啟動,必須通過其他程序來啟動它。,7.2.4Java的多線程機制,7.2.5線程的生命周期,線程要經(jīng)歷創(chuàng)建、就緒、運行、阻塞和死亡等5個狀態(tài),稱為生命周期。,1、創(chuàng)建狀態(tài)當(dāng)我們通過new命令創(chuàng)建了一個線程對象,則該線程對象就處于創(chuàng)建狀態(tài)。如下面語句所示:Threadthread1=newThread();創(chuàng)建狀態(tài)是線程已被創(chuàng)建但未開始執(zhí)行的一個特殊狀態(tài)。此時線程對象擁有自己的內(nèi)存空間,但沒有分配CPU資源,需通過star
10、t()方法調(diào)度進入就緒狀態(tài)等待CPU資源。,2、就緒狀態(tài)處于創(chuàng)建狀態(tài)的線程對象通過start()方法進入就緒狀態(tài),如下面語句所示:Threadthread1=newThread();Thread1.start();start()方法同時調(diào)用了線程體,也就是run()方法,表示線程對象正等待CPU資源,隨時可被調(diào)用執(zhí)行。(即只要調(diào)度程序把時間片分配給線程,線程就可以運行了),3、運行狀態(tài)若線程處于正在運行的狀態(tài),表示線程已經(jīng)擁有了對處理器的控制權(quán),其代碼目前正在運行,除非運行過程中控制權(quán)被另一優(yōu)先級更高的線程搶占,否則這一線程將一直持續(xù)到運行完畢。,4、阻塞狀態(tài)一個線程進入阻塞狀態(tài),可能有如下原
11、因:1你通過調(diào)用sleep(milliseconds)使線程進入休眠狀態(tài),在這種情況下,線程在指定的時間內(nèi)不會運行。2你通過調(diào)用wait()使線程掛起。直到線程得到了notify()或notifyAll()消息,線程才會進入就緒狀態(tài)。3線程在等待某個輸入/輸出完成。4線程試圖在某個對象上調(diào)用其同步控制方法,但是對象鎖不可用。,5、死亡狀態(tài)死亡狀態(tài)(或終止?fàn)顟B(tài)),表示線程已退出運行狀態(tài),并且不再進入就緒隊列。,一個線程的生命周期一般經(jīng)過如下步驟:(1)一個線程通過new()操作實例化后,進入創(chuàng)建狀態(tài)。(2)通過調(diào)用start()方法進入就緒狀態(tài),一個處在就緒狀態(tài)的線程將被調(diào)度執(zhí)行,執(zhí)行該線程相應(yīng)
12、的run()方法中的代碼。(3)通過調(diào)用線程的(或從Object類繼承過來的)sleep()或wait()方法,這個線程進入阻塞狀態(tài)。一個線程也可能自己完成阻塞操作。(4)當(dāng)run()方法執(zhí)行完畢,或者有一個例外產(chǎn)生,或者執(zhí)行System.exit(0)方法,則一個線程就進入死亡狀態(tài)。,7.3線程的創(chuàng)建方式,在Java語言中,可采用兩種方式產(chǎn)生線程:(1)通過創(chuàng)建Thread類的子類來構(gòu)造線程。Java定義了一個直接從根類Object中派生的Thread類。所有從這個類派生的子類或間接子類,均為線程。(2)通過實現(xiàn)一個Runnable接口的類來構(gòu)造線程。,7.3.1創(chuàng)建Thread子類構(gòu)造線程
13、,線程的創(chuàng)建與啟動:(1)創(chuàng)建一個Thread類的子類;(2)在子類中重新定義自己的run()方法,這個中包含了線程要實現(xiàn)的操作;(3)用關(guān)鍵字new創(chuàng)建一個線程對象;(4)調(diào)用start()方法啟動線程。,【例7-4】創(chuàng)建二個Thread類的子類,然后在另一個類中建立這2個Thread類的對象來測試它,看具體會發(fā)生什么現(xiàn)象。,這個例子說明了這樣幾個事實:(1)創(chuàng)建獨立執(zhí)行線程比較容易,Java負責(zé)處理了大部分細節(jié)。(2)各線程并發(fā)運行,共同爭搶CPU資源,線程搶奪到CPU資源后,就開始執(zhí)行,無法準確知道某線程能在什么時候開始執(zhí)行。(3)線程間的執(zhí)行是相互獨立的。(4)線程獨立于啟動它的線程(
14、或程序)。,7.3.2實現(xiàn)Runnable接口構(gòu)造線程,線程構(gòu)造的步驟如下:1、實現(xiàn)Runnable接口2、定義run()方法3、構(gòu)造線程:Thread(Runnable對象名);4、啟動線程:線程對象.start();,【例7-5】創(chuàng)建一個實現(xiàn)Runnable接口的線程類,然后在另一個類中建立2個線程對象來測試它,看具體會發(fā)生什么現(xiàn)象。,【例7-6】我們用Thread子類程序來模擬航班售票系統(tǒng),實現(xiàn)四個售票窗口發(fā)售某班次航班的100張機票,一個售票窗口用一個線程來表示。,【例7-7】用Runnable接口程序來模擬航班售票系統(tǒng),實現(xiàn)四個售票窗口發(fā)售某班次航班的100張機票,一個售票窗口用一個
15、線程來表示。,【例7-8】設(shè)計一個多線程的應(yīng)用程序,模擬一個臺子上有多個彈子在上面滾動。“彈子”在碰到“臺子”的邊緣時會被彈回來。,7.4線程同步,由于多線程要共享內(nèi)存資源,因此有可能一個線程正在使用某個資源,而另一個線程卻在更新它,這樣,會造成數(shù)據(jù)的不正確。因此對于多個線程共享的資源,必須采取措施,使得每次只有一個線程能使用它,這就是多線程中的同步(synchronization)問題。訪問受限資源的第一個線程給資源加鎖,接著其它線程就只能等到鎖被解除以后才能訪問該資源。,7.4.1使用多線程造成的數(shù)據(jù)混亂,【例7-9】設(shè)計一個模擬用戶從銀行取款的應(yīng)用程序。設(shè)某銀行帳戶存款額的初值是2000
16、元,用線程模擬兩個用戶從銀行取款的情況。,通過對該程序的分析,發(fā)現(xiàn)出現(xiàn)錯誤結(jié)果的根本原因是兩個并發(fā)線程共享同一內(nèi)存變量所引起的。后一線程對變量的更改結(jié)果覆蓋了前一線程對變量的更改結(jié)果,造成數(shù)據(jù)混亂。,7.4.2同步線程,1、Synchronized方法,聲明Synchronized方法的一般格式為:publicsynchronized返回類型方法名()/*方法體*/,【例7-10】改寫例7-9,用線程同步的方法設(shè)計用戶從銀行取款的應(yīng)用程序。,【例7-11】設(shè)計一個模擬車輛通過交通路口的程序。,本示例創(chuàng)建了三個類,一個是車輛類ICar,由線程繪制2輛不同方向行駛的小車。另一個是交通警察類Traf
17、ficCop,控制二輛車的線程同步,(根據(jù)車輛的位置)。還有一個是車輛在道路上行駛的窗體類Car,該類繪制了2條相互垂直的道路,調(diào)用車輛線程(車輛行駛)。,7.5線程基本應(yīng)用,(1)sleep()方法該方法指定線程休眠一段時間。時間單位是毫秒。如下面語句所示:Threadthread1=newThread();thread1.start();trythread1.sleep(2000);catch(InterruptedExceptione),sleep()方法在休眠時間到期之前有可能被中斷。如果某人持有對此線程的引用,并且在此線程上調(diào)用了interrupt()方法,就會發(fā)生這種情況。(如果對
18、線程調(diào)用了wait()或join()方法,interrupt()也會對線程有影響,所以對這些方法的調(diào)用也必須放在類似的try塊中。),(2)yield()方法-線程讓步線程調(diào)度機制是搶占式的,如果你知道run()方法中已經(jīng)完成了所需的工作,你可以給線程調(diào)度機制一個暗示:你的工作已經(jīng)做得差不多了,可以讓別的線程使用處理器了。這個暗示將通過調(diào)用yield()方法的形式來作出。,(3)wait()、notify()和notifyAll()-線程之間協(xié)作在同步控制方法中,調(diào)用sleep()的時候鎖并沒有被釋放,但在調(diào)用wait()時,線程的執(zhí)行被掛起,對象上的鎖被釋放。只能在同步控制方法或同步控制塊里
19、調(diào)用wait(),notify()和notifyAll()(因為不用操作鎖,所以sleep()可以在非同步控制方法里調(diào)用),wait()有兩種形式:第一種接受毫秒作為參數(shù),意思與sleep()方法里參數(shù)的意思相同,都是指“在此期間暫停”。不同之處在于,對于wait():1在wait()期間鎖是釋放的。2你可以通過notify()、notifyAll(),或者時間到期,從wait()中恢復(fù)執(zhí)行。第二種形式的wait()不要參數(shù);這種用法更常見。wait()將無限等待直到線程接收到notify()或者notifyAll()消息。,(4)join()-加入到某個線程一個線程可以在其它線程之上調(diào)用jo
20、in()方法,其效果是等待一段時間直到第二個線程結(jié)束才繼續(xù)執(zhí)行。如果某個線程在另一個線程t上調(diào)用t.join(),此線程將被掛起,直到目標(biāo)線程t結(jié)束才恢復(fù)(即t.isAlive()返回為假)。,(5)線程優(yōu)先權(quán)線程的“優(yōu)先權(quán)”(priority)能告訴調(diào)度程序其重要性如何。盡管處理器處理現(xiàn)有線程集的順序是不確定的,但是如果有許多線程被阻塞并在等待運行,那么調(diào)度程序?qū)A向于讓優(yōu)先權(quán)最高的線程先執(zhí)行,那么優(yōu)先級較低的線程不是不執(zhí)行而是執(zhí)行的頻率較低。線程的優(yōu)先權(quán)是通過使用setPriority()方法進行調(diào)整的。優(yōu)先權(quán)有三種級別MAX_PRIORITY,NORM_PRIORITY,和MIN_PRIORITY。,(6)死鎖因為線程可以阻塞,并且對象可以具有同步控制方法,用以防止別的線程在鎖還沒有釋放的時候就訪問這個對象。所以就可能出現(xiàn)這種情況:某個線程在等待另一個線程,而后者又等待別的線程,這樣一直下去,直到這個鏈條上的線程又在等待第一個線程釋放鎖。線程之間相互等待的連續(xù)循環(huán),沒有哪個線程能繼續(xù),稱為“死鎖”。,當(dāng)以下四個條件同時滿足時,就會發(fā)生死鎖:1互斥條件:線程使用的資源中至少有一個是不能共享的。2至少有一個進程持
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026廈門銀行三明分行社會招聘考試參考試題及答案解析
- 2026湖北武漢市華中農(nóng)業(yè)大學(xué)韓文元課題組誠聘博士后筆試模擬試題及答案解析
- 2026云南怒江州貢山縣醫(yī)療保障局選聘醫(yī)療保障義務(wù)社會監(jiān)督員10人考試備考題庫及答案解析
- 2026廣西崇左市江州區(qū)消防救援大隊招聘財務(wù)會計1人考試備考題庫及答案解析
- 2026廣東清遠市佛岡縣石角鎮(zhèn)招聘專職消防安全監(jiān)管員2人考試備考題庫及答案解析
- 2026內(nèi)蒙古民族大學(xué)招聘銀齡教師17人考試參考題庫及答案解析
- 2026安徽消防中控員考試參考試題及答案解析
- 2026年溫醫(yī)大眼視光干細胞生物醫(yī)學(xué)與生物材料工程研究組招聘備考題庫及1套完整答案詳解
- 南京古生物所非在編項目聘用人員(勞務(wù)派遣)招聘備考題庫(2025年第18期)及參考答案詳解一套
- 中國支付清算協(xié)會2026年度公開招聘備考題庫含答案詳解
- 2626《藥事管理與法規(guī)》國家開放大學(xué)期末考試題庫
- 合資船舶合同范本
- 2025年云南昆明巫家壩建設(shè)發(fā)展有限責(zé)任公司及下屬公司第四季度社會招聘31人筆試參考題庫附帶答案詳解(3卷)
- 2026年湖南化工職業(yè)技術(shù)學(xué)院單招職業(yè)技能考試題庫含答案詳解
- 食材配送公司管理制度(3篇)
- 供銷合同示范文本
- 2024年供應(yīng)鏈運營1+X職業(yè)技能等級證書中級考試(含答案解析)
- 《分布式光伏發(fā)電開發(fā)建設(shè)管理辦法》問答(2025年版)
- 國家金融監(jiān)督管理總局真題面試題及答案
- 大型商場顧客滿意度調(diào)查報告
- 落地式腳手架拆除安全專項施工方案
評論
0/150
提交評論