6.Java網(wǎng)絡(luò)編程實(shí)驗(yàn)-多線程_第1頁
6.Java網(wǎng)絡(luò)編程實(shí)驗(yàn)-多線程_第2頁
6.Java網(wǎng)絡(luò)編程實(shí)驗(yàn)-多線程_第3頁
6.Java網(wǎng)絡(luò)編程實(shí)驗(yàn)-多線程_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

Java網(wǎng)絡(luò)編程實(shí)驗(yàn)報(bào)告(實(shí)驗(yàn)六)學(xué)號:姓名:實(shí)驗(yàn)項(xiàng)目名稱:多線程教師評分:一、實(shí)驗(yàn)?zāi)康模?)了解線程的概念。(2)學(xué)習(xí)簡單的多線程編程。二、預(yù)習(xí)內(nèi)容及要求(要求寫出預(yù)習(xí)內(nèi)容)進(jìn)程和線程的概念進(jìn)程是程序一次動態(tài)執(zhí)行的過程,對應(yīng)從代碼加載、執(zhí)行到執(zhí)行結(jié)束這樣一個(gè)完整的過程,也是進(jìn)程自身從產(chǎn)生、發(fā)展到消亡的過程。線程是比進(jìn)程更小的執(zhí)行單元,一個(gè)進(jìn)程在執(zhí)行過程中,可以產(chǎn)生多個(gè)線程。每個(gè)線程都有自身的產(chǎn)生、執(zhí)行和消亡的過程。線程的狀態(tài)與生命周期新建:當(dāng)一個(gè)Thread類或其子類的對象被聲明并創(chuàng)建時(shí),新生的線程對象處于新建狀態(tài)。此時(shí)它已經(jīng)有了相應(yīng)的內(nèi)存空間和其他資源。運(yùn)行:線程創(chuàng)建之后就具備了運(yùn)行的條件,一旦輪到它來享用CPU資源時(shí),即JVM將CPU使用權(quán)切換給該線程時(shí),此線程的就可以脫離創(chuàng)建它的主線程獨(dú)立開始自己的生命周期了(即run方法執(zhí)行的過程)。中斷:有4種原因的中斷,CPU資源從當(dāng)前線程切換給其他線程、執(zhí)行了sleep(intmillsecond)方法、執(zhí)行了wait()方法、進(jìn)入阻塞狀態(tài)。死亡:run方法結(jié)束。線程的創(chuàng)建在Java語言中,與線程支持密切相關(guān)的是java.lang.Thread類和java.lang.Runnable接口。Runnable接口定義很簡單,只有一個(gè)run方法。任何一個(gè)類如果希望自己的實(shí)例能夠以線程的形式執(zhí)行,都可以來實(shí)現(xiàn)Runnable接口。繼承Thread類和實(shí)現(xiàn)Runnable接口,都可以用來創(chuàng)建Thread對象,效果上并沒有什么不同。繼承Thread類的方法很明顯的缺點(diǎn)就是這個(gè)類不能再繼承其他的類了,而實(shí)現(xiàn)Runnable接口不會有這個(gè)麻煩。另外,在繼承Thread類的代碼中,this其實(shí)就是指當(dāng)前正在運(yùn)行的線程對象,如果使用實(shí)現(xiàn)Runnable接口的方式,要得到當(dāng)前正在執(zhí)行的線程,需要使用Thread.currentThread()方法。線程創(chuàng)建后僅僅是占有了內(nèi)存資源,在JVM管理的線程中還沒有這個(gè)線程,此線程必須調(diào)用start()方法(從父類繼承的方法)通知JVM,這樣JVM就會知道又有一個(gè)新一個(gè)線程排隊(duì)等候切換了。注意:多次啟動一個(gè)線程,或者啟動一個(gè)已經(jīng)運(yùn)行的線程對象是非法的,會拋出IllegalThreadStateException異常對象。線程的優(yōu)先級同一時(shí)刻在等待隊(duì)列中的線程會有很多個(gè),它們各自任務(wù)的重要性有所不同。為了加以區(qū)分,使工作安排和資源分配時(shí)間更為合理,每個(gè)線程可以被賦予不同的優(yōu)先級,讓任務(wù)比較急的線程擁有更高的優(yōu)先級,從而更快地進(jìn)入執(zhí)行狀態(tài)。Java中提供了10個(gè)等級的線程優(yōu)先級,最低為Thread.MIN_PRIORITY=1,最高為Thread.MAX_PRIORITY=10,默認(rèn)優(yōu)先級為Thread.NORM_PRIORITY=5。使用Thread類中的setPriority(int)方法可以為線程指定優(yōu)先級。線程的常用方法start()方法:線程調(diào)用該方法將啟動線程,使之從新建狀態(tài)進(jìn)入就緒隊(duì)列排隊(duì),一旦輪到它來享用CPU資源時(shí),就可以脫離創(chuàng)建它的線程獨(dú)立開始自己的生命周期了。run()方法:Thread類的run()方法與Runnable接口中的run()方法的功能和作用相同,都用來定義線程對象被調(diào)度之后所執(zhí)行的操作,都是系統(tǒng)自動調(diào)用而用戶程序不得引用的方法。系統(tǒng)的Thread類中,run()方法沒有具體內(nèi)容,所以用戶程序需要創(chuàng)建自己的Thread類的子類,并重寫run()方法來覆蓋原來的run()方法。當(dāng)run方法執(zhí)行完畢,線程就變成死亡狀態(tài)。sleep(intmillsecond)方法:現(xiàn)程占有CPU期間,執(zhí)行sleep方法來使自己放棄CPU資源,休眠一段時(shí)間。休眠時(shí)間的長短由sleep方法的參數(shù)決定,millsecond是毫秒為單位的休眠時(shí)間。如果線程在休眠時(shí)被打斷,JVM就拋出InterruptedException異常。因此,必須在try~catch語句塊中調(diào)用sleep方法。isAlive()方法:線程處于“新建”狀態(tài)時(shí),線程調(diào)用isAlive()方法返回false。當(dāng)一個(gè)線程調(diào)用start()方法,并占有CPU資源后,該線程的run方法就開始運(yùn)行,在線程的run方法結(jié)束之前,即沒有進(jìn)入死亡狀態(tài)之前,線程調(diào)用isAlive()方法返回true。當(dāng)線程進(jìn)入“死亡”狀態(tài)后(實(shí)體內(nèi)存被釋放),線程仍可以調(diào)用方法isAlive(),這時(shí)返回的值是false。一個(gè)已經(jīng)運(yùn)行的線程在沒有進(jìn)入死亡狀態(tài)時(shí),不要再給線程分配實(shí)體,由于線程只能引用最后分配的實(shí)體,先前的實(shí)體就會成為“垃圾”,并且不會被垃圾收集機(jī)收集掉。currentThread()方法:currentThread()方法是Thread類中的類方法,可以用類名調(diào)用,該方法返回當(dāng)前正在使用CPU資源的線程。interrupt()方法:intertupt方法經(jīng)常用來“吵醒”休眠的線程。當(dāng)一些線程調(diào)用sleep方法處于休眠狀態(tài)時(shí),一個(gè)占有CPU資源的線程可以讓休眠的線程調(diào)用interrupt方法“吵醒”自己。線程的同步線程同步是指幾個(gè)線程都需要調(diào)用一個(gè)同步方法(使用關(guān)鍵字synchronized修飾的方法)。當(dāng)一個(gè)線程A使用一個(gè)synchronized修飾的方法時(shí),其他線程想使用這個(gè)方法時(shí)就必須等待,直到線程A使用完該方法(除非線程A使用wait主動讓出CPU資源)。一個(gè)線程在使用的同步方法中時(shí),可能根據(jù)問題的需要,必須使用wait()方法使本線程等待,暫時(shí)讓出CPU的使用權(quán),并允許其它線程使用這個(gè)同步方法。其它線程如果在使用這個(gè)同步方法時(shí)如果不需要等待,那么它用完這個(gè)同步方法的同時(shí),應(yīng)當(dāng)執(zhí)行notifyAll()方法通知所有的由于使用這個(gè)同步方法而處于等待的線程結(jié)束等待。掛起:有時(shí)候兩個(gè)線程并不是同步的,即不涉及都需要調(diào)用一個(gè)同步方法,但線程也可能需要暫時(shí)的掛起。所謂掛起一個(gè)線程就是讓線程暫時(shí)讓出CPU的使用權(quán)限,暫時(shí)停止執(zhí)行,但停止執(zhí)行的持續(xù)時(shí)間不確定,因此不能使用sleep方法暫停線程。掛起一個(gè)線程需使用wait方法,即讓準(zhǔn)備掛起的線程調(diào)用wait方法,主動讓出CPU的使用權(quán)限.恢復(fù):為了恢復(fù)該線程,其它線程在占有CUP資源期間,讓掛起的線程的目標(biāo)對象執(zhí)行notifyAll()方法,使得掛起的線程繼續(xù)執(zhí)行;如果線程沒有目標(biāo)對象,為了恢復(fù)該線程,其它線程在占有CUP資源期間,讓掛起的線程調(diào)用notifyAll()方法,使掛起的線程繼續(xù)執(zhí)行。三、實(shí)驗(yàn)內(nèi)容、操作過程及實(shí)驗(yàn)結(jié)果記錄1.輸入下面的JavaApplication程序,運(yùn)行該程序,并簡要分析程序的運(yùn)行結(jié)果。2.編寫程序,將上面多線程程序用Runnable接口來實(shí)現(xiàn)。3.編寫一個(gè)創(chuàng)建三個(gè)線程對象的程序。每個(gè)線程應(yīng)該輸出一則消息,并在消息后緊跟字符串“消息結(jié)束”。在線程輸出消息后,應(yīng)暫停一秒鐘,然后才輸出“消息結(jié)束”。首先應(yīng)該有線程1輸出消息,然后是線程2和線程3.提示: 創(chuàng)建一個(gè)類Callme,其中包含call方法。此方法輸出消息后暫停1秒,然后輸出“消息結(jié)束”。創(chuàng)建一個(gè)類Calle

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論