《Java SE程序設(shè)計(jì)及實(shí)踐》課件12-第12章 線程知識(shí)_第1頁
《Java SE程序設(shè)計(jì)及實(shí)踐》課件12-第12章 線程知識(shí)_第2頁
《Java SE程序設(shè)計(jì)及實(shí)踐》課件12-第12章 線程知識(shí)_第3頁
《Java SE程序設(shè)計(jì)及實(shí)踐》課件12-第12章 線程知識(shí)_第4頁
《Java SE程序設(shè)計(jì)及實(shí)踐》課件12-第12章 線程知識(shí)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

-1-理解線程的基本概念理解Java的線程模型掌握J(rèn)ava線程的狀態(tài)和狀態(tài)轉(zhuǎn)換掌握線程的創(chuàng)建和使用掌握線程優(yōu)先級(jí)的使用理解多線程的概念掌握J(rèn)ava的多線程實(shí)現(xiàn)掌握線程的同步技巧掌握線程的通信方式理解死鎖的概念目標(biāo)-2-線程多線程:在一個(gè)程序中同時(shí)運(yùn)行多個(gè)任務(wù)多進(jìn)程:在操作系統(tǒng)中能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)線程和進(jìn)程的區(qū)別:進(jìn)程是運(yùn)行中的應(yīng)用程序,擁有自己獨(dú)立的內(nèi)存空間和資源一個(gè)進(jìn)程可以有一個(gè)或多個(gè)線程組成,且至少有一個(gè)線程稱為主線程線程是最小的處理單位,多個(gè)線程共享一塊內(nèi)存和資源當(dāng)一個(gè)線程改變了所屬進(jìn)程的變量時(shí),其它線程下次訪問該變量時(shí)得到這種改變線程(Thread)是獨(dú)立于其他線程運(yùn)行的程序執(zhí)行單元。

-3-線程的優(yōu)點(diǎn)充分利用CPU資源簡(jiǎn)化編程模型簡(jiǎn)化異步事件處理使GUI更有效率節(jié)約成本-4-Java線程模型線程模型:Thread類Runnable接口Thread和Runnable區(qū)別:Thread是類,具有線程的所有方法,其對(duì)象就是一個(gè)線程對(duì)象。但繼承Thread,就不能再繼承其他的類(Java只支持單一繼承)。Runnable是接口,只提供run()方法,實(shí)現(xiàn)該接口的類還可以繼承其他類,但其對(duì)象不是線程對(duì)象,不能直接運(yùn)行,必須通過Thread將其啟動(dòng)。

Thread類封裝線程所必須的功能,有start()、run()、sleep()等方法Runnable接口是標(biāo)識(shí)某個(gè)Java類是否可作為線程類的接口,該接口中只提供了一個(gè)run()方法。-5-線程使用每個(gè)Java程序至少包含一個(gè)線程:主線程。其他線程都是通過Thread構(gòu)造器或?qū)嵗^承類Thread的類來創(chuàng)建的。示例classMainThread{ publicstaticvoidmain(Stringargs[]){ //調(diào)用Thread類的currentThread()方法獲取當(dāng)前線程

Threadt=Thread.currentThread(); System.out.println("主線程是:"+t); }}-6-創(chuàng)建線程創(chuàng)建線程有兩種方法:使用Thread類使用Runnable接口繼承Thread類,重寫run方法,可以創(chuàng)建線程類。語法格式:示例:class<類_名>extendsThread{ //重寫run()方法

publicvoidrun(){ //線程的任務(wù)功能

}}classThread1extendsThread{ publicvoidrun(){ //獲取當(dāng)前線程的名字

System.out.println( Thread.currentThread().getName()); }}-7-Thread類方法名功能說明Thread()構(gòu)造缺省的線程對(duì)象Thread(Runnabletarget)使用傳遞的Runnable構(gòu)造線程對(duì)象Thread(Runnabletarget,Stringname)使用傳遞的Runnable構(gòu)造名為name的線程對(duì)象Thread(ThreadGroupgroup,Runnabletarget,Stringname)使用傳遞的Runnable再group線程組內(nèi)構(gòu)造名為name的線程對(duì)象finalStringgetName()返回線程的名稱finalbooleanisAlive()如果線程是激活的,則返回truefinalvoidsetName(Stringname)將線程的名稱設(shè)置為由name指定的名稱set\getPriority()設(shè)置得到線程優(yōu)先級(jí)finalvoidjoin()等待線程結(jié)束staticvoidsleep(longmillis)用于將線程掛起一段時(shí)間,單位毫秒voidstart()調(diào)用run()方法啟動(dòng)線程,開始線程的執(zhí)行voidstop()停止線程。已經(jīng)不建議使用voidinterrput()中斷線程staticintactiveCount()返回激活的線程數(shù)staticvoidyield()使正在執(zhí)行的線程臨時(shí)暫停,并允許其他線程執(zhí)行-8-Runnable接口Runnable接口由單個(gè)方法run()組成,它在線程激活時(shí)執(zhí)行。通過Runnable接口創(chuàng)建線程的步驟如下:1.實(shí)例化實(shí)現(xiàn)Runnable接口的類2.建立一個(gè)Thread對(duì)象,并將第一步實(shí)例化后的對(duì)象作為參數(shù)傳入Thread類的構(gòu)造方法3.通過Thread類的start()方法建立線程。

class<類_名>implementsRunnable{ publicvoidrun(){ //線程的任務(wù)功能

}}-9-線程狀態(tài)-1線程狀態(tài):born:新線程狀態(tài)runnable、running:就緒、運(yùn)行狀態(tài)blocked:阻塞狀態(tài)sleeping:休眠狀態(tài)waiting:等待狀態(tài)dead:死亡狀態(tài)-10-線程狀態(tài)-2born:新線程狀態(tài)當(dāng)使用new來新建一個(gè)線程時(shí),一個(gè)新的的線程就誕生了。當(dāng)對(duì)這個(gè)線程調(diào)用了start()方法,或者這個(gè)線程的狀態(tài)由born改變?yōu)閞unnable后。runnable、running:就緒、運(yùn)行狀態(tài)把處理器分配給一個(gè)處于runnable的線程之后,這個(gè)線程的狀態(tài)就變成了running??梢酝ㄟ^Thread類的isAlive()方法來判斷線程是否處于運(yùn)行狀態(tài)。

blocked:阻塞狀態(tài)在線程試圖執(zhí)行某個(gè)不能立即完成的任務(wù),并且該線程必須等待其他任務(wù)完成才能繼續(xù)時(shí),則該線程進(jìn)入阻塞狀態(tài)(blocked)。例如,線程等待輸入/輸出請(qǐng)求。sleeping:休眠狀態(tài)線程執(zhí)行過程中,可以通過sleep()方法使線程暫時(shí)停止執(zhí)行,使線程進(jìn)入sleep狀態(tài)。sleep()方法的參數(shù)是毫秒,并聲明了InterruptedException異常。另外還可以使用suspend()和resume()方法掛起和喚醒線程。-11-線程狀態(tài)-3waiting:等待狀態(tài)如果某個(gè)線程的執(zhí)行條件還未滿足,可以調(diào)用wait()方法,使其進(jìn)入等待狀態(tài)。一旦線程處于等待狀態(tài),在另一個(gè)線程對(duì)其等待對(duì)象調(diào)用notify()或notifyAll()方法時(shí),則線程回到就緒狀態(tài)。dead:死亡狀態(tài)線程在下列情況下會(huì)結(jié)束:線程到run()方法的結(jié)尾;線程拋出一個(gè)未捕獲異?;駿rror;調(diào)用interrupt()方法中斷線程;調(diào)用join()方法等待線程結(jié)束;調(diào)用stop()方法直接停止線程。演示:水平移動(dòng)按鈕-12-線程狀態(tài)-4btnStart.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ //創(chuàng)建線程對(duì)象

t=newThread(ButtonMove.this); //線程啟動(dòng)

t.start(); }});btnStop.addActionListener(newActionListener(){ publicvoidactionPerformed(ActionEvente){ if(t.isAlive()){ //線程停止

t.stop(); } }});publicvoidrun(){ try{ //休眠100毫秒

t.sleep(100); }catch(InterruptedExceptione){ e.printStackTrace(); }}-13-線程優(yōu)先級(jí)線程的優(yōu)先級(jí)代表該線程的重要程度,當(dāng)有多個(gè)線程同時(shí)處于可執(zhí)行狀態(tài)并等待獲得CPU時(shí)間時(shí),線程調(diào)度系統(tǒng)根據(jù)各個(gè)線程的優(yōu)先級(jí)來決定CPU分配時(shí)間,優(yōu)先級(jí)高的線程有更大的機(jī)會(huì)獲得CPU時(shí)間。線程的默認(rèn)優(yōu)先級(jí)值:Thread.NORM_PRIORITY,值為5每個(gè)新線程均繼承創(chuàng)建線程的優(yōu)先級(jí)。setPriority()設(shè)置線程優(yōu)先級(jí),值為MIN_PRIORITY(1)和MAX_PRIORITY(10)之間的值。getPriority()獲取線程的優(yōu)先級(jí)值。

-14-就是在一個(gè)程序中實(shí)現(xiàn)多任務(wù)處理,即在主線程中有多個(gè)線程在運(yùn)行,多個(gè)線程的執(zhí)行是并發(fā)的。多線程,由于各個(gè)線程的控制流彼此獨(dú)立,使得各個(gè)線程之間的代碼是亂序執(zhí)行的,由此帶來的線程調(diào)度、同步等問題。

多線程-15-線程同步:保證某個(gè)資源在某一時(shí)刻只能由一個(gè)線程訪問,以此保證共享數(shù)據(jù)及操作的完整性。同步的關(guān)鍵字synchronized可以使用synchronized關(guān)鍵字修飾同步方法或同步塊 同步方法語法:同步塊語法:線程同步synchronized返回類型方法(參數(shù)){//同步方法體}synchronized(object){//需要同步的語句}-16-線程通信線程通信的方法:wait()、notify()和notifyAll()調(diào)用wait()方法可以讓線程等待,并釋放對(duì)象鎖,直到interrupt()方法中斷它或者另一個(gè)線程調(diào)用notify()或notifyAll()通知它。wait()方法也可以帶一個(gè)參數(shù),用于指明等待的時(shí)間,使用此種方式不需要notify()或notifyAll()的喚醒。此方法只能在一個(gè)同步方法中調(diào)用。調(diào)用notify()方法時(shí)可以隨機(jī)選擇一個(gè)在該對(duì)象調(diào)用wait()方法的線程,解除它的阻塞。調(diào)用notifyAll()方法可以喚醒等待該對(duì)象的所有線程。但喚醒時(shí)無法控制喚醒哪個(gè)線程,喚醒過程完全由系統(tǒng)來控制。notify()方法和notifyAll()方法只能在同步方法或同步塊內(nèi)部使用。wait()方法區(qū)別于sleep()方法的是:wait()方法調(diào)用時(shí)會(huì)釋放對(duì)象鎖,而sleep()方法不會(huì)。-17-死鎖死鎖,是指兩個(gè)或多個(gè)線程都在等待對(duì)方釋放對(duì)象資源而進(jìn)入的一種不可“調(diào)節(jié)”的狀態(tài)。常見的死鎖模式是:當(dāng)線程A擁有obj1上的對(duì)象鎖,為完成任務(wù)同時(shí)需要獲取obj2上的對(duì)象鎖,而此時(shí)線程B正擁有obj2的對(duì)象鎖,其為完成任務(wù)需要獲取obj1上的對(duì)象鎖。此時(shí)兩個(gè)線程在對(duì)象資源上即無法獲取(對(duì)方線程未執(zhí)行完畢)也無法釋放(自身線程未執(zhí)行完畢),程序進(jìn)入無限期的等待,死鎖就發(fā)生了。-18-線程(Thread)是獨(dú)立于其他線程運(yùn)行的程序執(zhí)行單元線程的主要應(yīng)用在于可以在一個(gè)程序中同時(shí)運(yùn)行多個(gè)任務(wù)通過繼承Thre

溫馨提示

  • 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)論