《Java程序設計》課件-項目七 多線程與IO文件流_第1頁
《Java程序設計》課件-項目七 多線程與IO文件流_第2頁
《Java程序設計》課件-項目七 多線程與IO文件流_第3頁
《Java程序設計》課件-項目七 多線程與IO文件流_第4頁
《Java程序設計》課件-項目七 多線程與IO文件流_第5頁
已閱讀5頁,還剩11頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

項目七多線程與I/O文件流Java程序設計一、Java多線程機制Java程序設計

1.多線程概念多線程機制是Java語言的又一重要特征,使用多線程技術可以使系統同時運行多個執行體,加快程序的響應時間,提高計算機資源的利用率。使用多線程技術可以提高整個應用系統的性能。

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

3.多線程和多任務:多線程和多任務是兩個既有聯系又有區別的概念,多任務是針對操作系統而言的,代表著操作系統可以同時執行的程序個數;多線程是針對一個程序而言的,代表著一個程序內部可以同時執行的線程個數,而每個線程可以完成不同的任務。例如Java推出的HotJava瀏覽器,你可以一邊瀏覽網頁一邊下載新網頁,可以同時顯示動畫和播放音樂。

4.主線程:當JVM加載代碼,發現main方法之后,就會啟動一個線程,這個線程稱作“主線程”,該線程負責執行main方法。如果main方法中沒有創建其他的線程,那么當main方法執行完最后一個語句,JVM就會結束我們的Java應用程序。如果main方法中又創建了其他線程,那么JVM就要在主線程和其他線程之間輪流切換,保證每個線程都有機會使用CPU資源,main方法即使執行完最后的語句,JVM也不會結束我們的程序,JVM一直要等到程序中的所有線程都結束之后,才結束我們的Java應用程序。Java多線程機制Java程序設計

5.線程的狀態與生命周期

1)新建當一個Thread類或其子類的對象被聲明并創建時,新生的線程對象處于新建狀態。此時它已經有了相應的內存空間和其他資源。

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

3)中斷有4種原因的中斷:CPU資源從當前線程切換給其他線程執行了sleep(intmillsecond)方法執行了wait()方法進入阻塞狀態

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

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

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

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

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

FileOutputStream提供了基本的文件寫入能力。構造方法:

FileOutputStream(Stringname)

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

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

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

與FileInputStream、FileOutputStream字節流相對應的是FileReader、FileWriter字符流,他們分別是Reader和Writer的子類,其構造方法分別是:

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

由于漢字在文件中占用2個字節,如果使用字節流,讀取不當會出現亂碼現象,采用字符流就可以避免這個現象,因為,在Unicode字符中,一個漢字被看作一個字符。使用文件對話框方便地打開和保存文件,因為文件對話框可以使用戶很方便的選擇文件所在的目錄以及文件的名字。I/O文件流Java程序設計6、數據流

DataInputStrea

溫馨提示

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

評論

0/150

提交評論