《Java程序設(shè)計(jì)》課件-項(xiàng)目七 多線程與IO文件流_第1頁
《Java程序設(shè)計(jì)》課件-項(xiàng)目七 多線程與IO文件流_第2頁
《Java程序設(shè)計(jì)》課件-項(xiàng)目七 多線程與IO文件流_第3頁
《Java程序設(shè)計(jì)》課件-項(xiàng)目七 多線程與IO文件流_第4頁
《Java程序設(shè)計(jì)》課件-項(xiàng)目七 多線程與IO文件流_第5頁
已閱讀5頁,還剩11頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

項(xiàng)目七多線程與I/O文件流Java程序設(shè)計(jì)一、Java多線程機(jī)制Java程序設(shè)計(jì)

1.多線程概念多線程機(jī)制是Java語言的又一重要特征,使用多線程技術(shù)可以使系統(tǒng)同時(shí)運(yùn)行多個(gè)執(zhí)行體,加快程序的響應(yīng)時(shí)間,提高計(jì)算機(jī)資源的利用率。使用多線程技術(shù)可以提高整個(gè)應(yīng)用系統(tǒng)的性能。

2.程序、進(jìn)程與線程的區(qū)別:程序是一段靜態(tài)的代碼,它是應(yīng)用軟件執(zhí)行的藍(lán)本。進(jìn)程是程序的一次動(dòng)態(tài)執(zhí)行過程,它對(duì)應(yīng)了從代碼加載、執(zhí)行至執(zhí)行完畢的一個(gè)完整過程,這個(gè)過程也是進(jìn)程本身從產(chǎn)生、發(fā)展至消亡的過程。線程是比進(jìn)程更小的執(zhí)行單位,一個(gè)進(jìn)程在其執(zhí)行過程中,可以產(chǎn)生多個(gè)線程,形成多條執(zhí)行線索,每條線索,即每個(gè)線程也有它自身的產(chǎn)生、存在和消亡的過程,也是一個(gè)動(dòng)態(tài)的概念。注意:世界萬物都可以同時(shí)完成多個(gè)工作,例如用戶可以使用計(jì)算機(jī)同時(shí)聽歌、打文件等活動(dòng),這些活動(dòng)可以同時(shí)進(jìn)行,這種思想在Java中稱為并發(fā),而將并發(fā)完成的每一件事情稱為線程。Java多線程機(jī)制Java程序設(shè)計(jì)

3.多線程和多任務(wù):多線程和多任務(wù)是兩個(gè)既有聯(lián)系又有區(qū)別的概念,多任務(wù)是針對(duì)操作系統(tǒng)而言的,代表著操作系統(tǒng)可以同時(shí)執(zhí)行的程序個(gè)數(shù);多線程是針對(duì)一個(gè)程序而言的,代表著一個(gè)程序內(nèi)部可以同時(shí)執(zhí)行的線程個(gè)數(shù),而每個(gè)線程可以完成不同的任務(wù)。例如Java推出的HotJava瀏覽器,你可以一邊瀏覽網(wǎng)頁一邊下載新網(wǎng)頁,可以同時(shí)顯示動(dòng)畫和播放音樂。

4.主線程:當(dāng)JVM加載代碼,發(fā)現(xiàn)main方法之后,就會(huì)啟動(dòng)一個(gè)線程,這個(gè)線程稱作“主線程”,該線程負(fù)責(zé)執(zhí)行main方法。如果main方法中沒有創(chuàng)建其他的線程,那么當(dāng)main方法執(zhí)行完最后一個(gè)語句,JVM就會(huì)結(jié)束我們的Java應(yīng)用程序。如果main方法中又創(chuàng)建了其他線程,那么JVM就要在主線程和其他線程之間輪流切換,保證每個(gè)線程都有機(jī)會(huì)使用CPU資源,main方法即使執(zhí)行完最后的語句,JVM也不會(huì)結(jié)束我們的程序,JVM一直要等到程序中的所有線程都結(jié)束之后,才結(jié)束我們的Java應(yīng)用程序。Java多線程機(jī)制Java程序設(shè)計(jì)

5.線程的狀態(tài)與生命周期

1)新建當(dāng)一個(gè)Thread類或其子類的對(duì)象被聲明并創(chuàng)建時(shí),新生的線程對(duì)象處于新建狀態(tài)。此時(shí)它已經(jīng)有了相應(yīng)的內(nèi)存空間和其他資源。

2)運(yùn)行線程創(chuàng)建之后就具備了運(yùn)行的條件,一旦輪到它來享用CPU資源時(shí),即JVM將CPU使用權(quán)切換給該線程時(shí),此線程的就可以脫離創(chuàng)建它的主線程獨(dú)立開始自己的生命周期了(即run方法執(zhí)行的過程)。

3)中斷有4種原因的中斷:CPU資源從當(dāng)前線程切換給其他線程執(zhí)行了sleep(intmillsecond)方法執(zhí)行了wait()方法進(jìn)入阻塞狀態(tài)

4)死亡run方法結(jié)束。Java多線程機(jī)制Java程序設(shè)計(jì)6.線程的創(chuàng)建:創(chuàng)建線程的方式有兩種:通過創(chuàng)建Thread類的子類來實(shí)現(xiàn);通過實(shí)現(xiàn)Runnable接口的類來實(shí)現(xiàn)。1)Thread的子類創(chuàng)建線程設(shè)計(jì)Thread的子類,重寫父類的run方法用Thread類或子類創(chuàng)建線程對(duì)象使用start方法啟動(dòng)線程當(dāng)JVM將CPU使用權(quán)切換給線程時(shí),自動(dòng)執(zhí)行run方法。注意:完成線程功能的代碼放在類的run()方法中,當(dāng)一個(gè)類繼承Thread類后,就可以在該類中覆蓋run()方法,將實(shí)現(xiàn)該線程功能的代碼寫入run()方法中,然后同時(shí)調(diào)用Thread類中的start()方法執(zhí)行線程,也就是調(diào)用run()方法。getName()獲取線程的名稱,默認(rèn)線程的名稱為Thread-編號(hào)。Java多線程機(jī)制Java程序設(shè)計(jì)2)使用Runnable接口實(shí)現(xiàn)多線程用繼承Thread類的子類或?qū)崿F(xiàn)Runable接口的類來創(chuàng)建線程無本質(zhì)區(qū)別,但由于Java不支持多重繼承,所以如果一個(gè)類必須繼承另一個(gè)非Thread類,此時(shí)要實(shí)現(xiàn)多線程只能通過實(shí)現(xiàn)Runnable接口的方式。通過Runnable接口實(shí)現(xiàn)多線程的方法:設(shè)計(jì)一個(gè)實(shí)現(xiàn)Runnable接口的類,重寫run方法;以該類的對(duì)象為參數(shù)建立Thread類的對(duì)象;調(diào)用Thread類對(duì)象的start方法啟動(dòng)線程,將執(zhí)行權(quán)轉(zhuǎn)交到run方法。線程的優(yōu)先級(jí)線程在創(chuàng)建時(shí),繼承了父類的優(yōu)先級(jí)。線程創(chuàng)建后,可以在任何時(shí)刻調(diào)用setPriority方法改變線程的優(yōu)先級(jí)。優(yōu)先級(jí)為1~10,Thread定義了其中3個(gè)常數(shù):MAX_PRIORITY最大優(yōu)先級(jí)(值為10);MIN_PRIORITY最小優(yōu)先級(jí)(值為1);NORM_PRIORITY默認(rèn)優(yōu)先級(jí)(值為5)Java多線程機(jī)制Java程序設(shè)計(jì)

7.線程的常用方法:start():線程調(diào)用該方法將啟動(dòng)線程,使之從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì),一旦輪到它來享用CPU資源時(shí),就可以脫離創(chuàng)建它的線程獨(dú)立開始自己的生命周期了。run():線程對(duì)象被調(diào)度之后所執(zhí)行的操作,由系統(tǒng)自動(dòng)調(diào)用,用戶程序不得引用。系統(tǒng)的Thread類中,run()方法沒有具體內(nèi)容,所以用戶程序需要?jiǎng)?chuàng)建自己的Thread類的子類,并重寫run()方法來覆蓋原來的run()方法。當(dāng)run方法執(zhí)行完畢,線程就變成死亡狀態(tài)。sleep(intmillsecond):線程占有CPU期間,執(zhí)行sleep方法來使自己放棄CPU資源,休眠一段時(shí)間。如果線程在休眠時(shí)被打斷,JVM就拋出InterruptedException異常。因此,必須在try~catch語句塊中調(diào)用sleep方法。isAlive():線程處于運(yùn)行狀態(tài)時(shí),isAlive()方法返回true,否則返回false。注意:一個(gè)已經(jīng)運(yùn)行的線程在沒有進(jìn)入死亡狀態(tài)時(shí),不要再給線程分配實(shí)體。currentThread():是Thread類中的類方法,可以用類名調(diào)用,該方法返回當(dāng)前正在使用CPU資源的線程。interrupt():用來“吵醒”休眠的線程。Java多線程機(jī)制Java程序設(shè)計(jì)8.線程同步:Java提供了多線程機(jī)制,通過多線程的并發(fā)運(yùn)行可以提高系統(tǒng)資源利用率,改善系統(tǒng)性能。但在有些情況下,一個(gè)線程必須和其他線程合作才能共同完成任務(wù)。線程可以共享內(nèi)存,利用這個(gè)特點(diǎn)可以在線程之間傳遞信息。注意:同步的前提必須有兩個(gè)或者兩個(gè)以上的線程、必須是多個(gè)線程使用同一個(gè)鎖、必須保證同步中只能有一個(gè)線程在運(yùn)行。在Java中,實(shí)現(xiàn)同步操作的方法是在共享內(nèi)存變量的方法前加synchronized修飾符。在程序運(yùn)行過程中,如果某一線程調(diào)用經(jīng)synchronized修飾的方法,在該線程結(jié)束此方法的運(yùn)行之前,其他所有線程都不能運(yùn)行該方法,只有等該線程完成此方法的運(yùn)行后,其他線程才能y運(yùn)行該方法。注意:synchronized關(guān)鍵字可以修飾方法,可以修飾代碼塊,但是不能修飾構(gòu)造器和屬性。存放線程執(zhí)行體的run()方法不能用synchronized關(guān)鍵字修飾,否則這樣線程依然不安全,只能修飾另外一個(gè)方法,然后在run()方法中調(diào)用該方法。當(dāng)同步代碼塊和同步方法同時(shí)維護(hù)多線程安全時(shí),要保證他們持有的同步監(jiān)視器必須相同,即this,否則線程不安全。二、I/O文件流Java程序設(shè)計(jì)I/O流提供一條通道程序,可以使用這條通道把源中的字節(jié)序列送給目的地。把輸入流的指向稱做源,程序從指向源的輸入流中讀取源中的數(shù)據(jù)。而輸出流的指向是字節(jié)要去的一個(gè)目的地(或用戶),程序通過向輸出流中寫入數(shù)據(jù)把信息傳遞到目的地。雖然I/O流經(jīng)常與磁盤文件存取有關(guān),但是程序的源和目的地也可以是鍵盤、鼠標(biāo)、內(nèi)存或顯示器窗口。Java的I/O流庫提供大量的流類(在包java.io中)。但是,所有輸入流類都是抽象類InputStream(字節(jié)輸入流)或抽象類Reader(字符輸入流)的子類,而所有輸出流都是抽象類OutputStream(字節(jié)輸出流)或抽象類Writer(字符輸出流)的子類。I/O文件流Java程序設(shè)計(jì)I/O文件流Java程序設(shè)計(jì)1、File類File類的對(duì)象主要用來獲取文件本身的一些信息,例如文件所在的目錄、文件的長度、文件讀寫權(quán)限等,不涉及對(duì)文件的讀寫操作構(gòu)造方法有3個(gè):

File(Stringfilename);File(StringdirectoryPath,Stringfilename);File(Filef,Stringfilename);注意:delete()方法刪除由File對(duì)象的路徑所表示的磁盤文件。它只能刪除普通文件,而不能刪除目錄,即使是空目錄也不行。File類不能訪問文件的內(nèi)容,即不能夠從文件中讀取數(shù)據(jù)或往文件里寫數(shù)據(jù),它只能對(duì)文件本身的屬性進(jìn)行操作。2、FileInputStream類

使用文件輸入流構(gòu)造方法建立通往文件的輸入流時(shí),可能會(huì)出現(xiàn)錯(cuò)誤(也被稱為異常)。為了把一個(gè)文件輸入流對(duì)象與一個(gè)文件關(guān)聯(lián)起來,使用類似于下面所示的代碼:try{FileInputStreamins=newFileInputStream("myfile.dat");}catch(IOExceptione){System.out.println("Filereaderror:"+e);//文件I/O錯(cuò)誤}I/O文件流Java程序設(shè)計(jì)從輸入流中讀取字節(jié)read方法給程序提供一個(gè)從輸入流中讀取數(shù)據(jù)的基本方法,read方法從輸入流中順序讀取源中的單個(gè)字節(jié)數(shù)據(jù),該方法返回字節(jié)值(0~255之間的一個(gè)整數(shù)),如果到達(dá)源的末尾,該方法返回-1。read方法還有其它一些形式。這些形式能使程序把多個(gè)字節(jié)讀到一個(gè)字節(jié)數(shù)組中:

intread(byteb[]);intread(byteb[],intoff,intlen);注意:InputStream是一個(gè)抽象類,程序中實(shí)際使用的是它的各種子類對(duì)象。不是所有的子類都會(huì)支持InputStream中定義的某些方法的,如skip,mark,reset等,這些方法只對(duì)某些子類有用。I/O文件流Java程序設(shè)計(jì)3、FileOutputStream類

FileOutputStream提供了基本的文件寫入能力。構(gòu)造方法:

FileOutputStream(Stringname)

FileOutputStream(Filefile)FileOutputStream流使用write方法把字節(jié)寫入到輸出流達(dá)到目的地,write的格式如下:

publicvoidwrite(byteb[])其功能是寫b.length個(gè)字節(jié)到輸出流。

publicvoid.write(byteb[],intoff,intlen)其功能是從給定字節(jié)數(shù)組中起始于偏移量off處寫len個(gè)字節(jié)到輸出流。I/O文件流Java程序設(shè)計(jì)4、FileReader類和FileWriter類

與FileInputStream、FileOutputStream字節(jié)流相對(duì)應(yīng)的是FileReader、FileWriter字符流,他們分別是Reader和Writer的子類,其構(gòu)造方法分別是:

FileReader(Stringfilename),FileWriter(Stringfilename)。注意:編譯運(yùn)行后的結(jié)果與使用FileInput的效果一致。由于FileWriter可以往文件中寫入字符串,我們不用將字符串轉(zhuǎn)換為字節(jié)數(shù)組。5、使用文件對(duì)話框打開和保存文件

由于漢字在文件中占用2個(gè)字節(jié),如果使用字節(jié)流,讀取不當(dāng)會(huì)出現(xiàn)亂碼現(xiàn)象,采用字符流就可以避免這個(gè)現(xiàn)象,因?yàn)椋赨nicode字符中,一個(gè)漢字被看作一個(gè)字符。使用文件對(duì)話框方便地打開和保存文件,因?yàn)槲募?duì)話框可以使用戶很方便的選擇文件所在的目錄以及文件的名字。I/O文件流Java程序設(shè)計(jì)6、數(shù)據(jù)流

DataInputStrea

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論