![Java程序開發(fā)教學(xué)課件10-線程_第1頁](http://file4.renrendoc.com/view12/M07/3F/2B/wKhkGWbvukWAY0kLAACmoi9UGLg145.jpg)
![Java程序開發(fā)教學(xué)課件10-線程_第2頁](http://file4.renrendoc.com/view12/M07/3F/2B/wKhkGWbvukWAY0kLAACmoi9UGLg1452.jpg)
![Java程序開發(fā)教學(xué)課件10-線程_第3頁](http://file4.renrendoc.com/view12/M07/3F/2B/wKhkGWbvukWAY0kLAACmoi9UGLg1453.jpg)
![Java程序開發(fā)教學(xué)課件10-線程_第4頁](http://file4.renrendoc.com/view12/M07/3F/2B/wKhkGWbvukWAY0kLAACmoi9UGLg1454.jpg)
![Java程序開發(fā)教學(xué)課件10-線程_第5頁](http://file4.renrendoc.com/view12/M07/3F/2B/wKhkGWbvukWAY0kLAACmoi9UGLg1455.jpg)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Java程序設(shè)計——線程重慶大學(xué)計算機(jī)學(xué)院學(xué)習(xí)內(nèi)容
什么是線程
線程的狀態(tài)
線程的構(gòu)造
線程的控制
多線程的互斥和同步
JavaSE8.0Lambda語法對線程的支持線程的概念
多任務(wù):計算機(jī)在看上去幾乎同一時間內(nèi)運行多個程序。
多線程:單個程序內(nèi)部也可以在同一時間進(jìn)行多種運算。
一個線程是一個程序內(nèi)部的順序控制流。
不是程序,自己本身不能運行,必須在程序中運行
如何在一個程序內(nèi)部實現(xiàn)多個線程。線程和進(jìn)程
每個進(jìn)程都有獨立的代碼和數(shù)據(jù)空間(進(jìn)程上下文),進(jìn)程切換的開銷大。
線程:輕量的進(jìn)程,同一類線程共享代碼和數(shù)據(jù)空間,每個線程有獨立的運行棧和程序計數(shù)器(PC),線程切換的開銷小。
多進(jìn)程:在操作系統(tǒng)中,能同時運行多個任務(wù)(程序)。
多線程:在同一應(yīng)用程序中,有多個順序流同時執(zhí)行。線程的概念模型
虛擬的CPU,封裝在java.lang.Thread類中。
CPU所執(zhí)行的代碼,傳遞給Thread類。
CPU所處理的數(shù)據(jù),傳遞給Thread類。線程體
Java的線程是通過java.lang.Thread類來實現(xiàn)的。
當(dāng)我們生成一個Thread類或者它的子類的對象后,一個新的線程就誕生了。
每個線程都是通過某個特定Thread對象的方法run()來完成其操作的,方法run()稱為線程體。線程的狀態(tài)newThread()yield()suspend()sleep()wait()start()newrunnableblockedresume()notify()stop()run()exitstop()stop()dead
創(chuàng)建狀態(tài)(newThread)ThreadmyThread=newMyThreadClass();
可運行狀態(tài)(Runnable)ThreadmyThread=newMyThreadClass();myThread.start();
這一狀態(tài)并不是運行中狀態(tài)(Running),因為也許線程并未真正執(zhí)行。
不可運行狀態(tài)(NotRunnable)
調(diào)用了sleep()方法;調(diào)用了suspend()方法;為等候一個條件變量,線程調(diào)用wait()方法;輸入輸出流中發(fā)生線程阻塞;
對于上面四種情況,都有可以返回可運行態(tài)的方法與之對應(yīng)。
1、sleep()方法中的參數(shù)為休息時間,單位為毫秒,時間過去后,線程即為可運行的。
2、一個線程調(diào)用suspend()方法后,只能由其它線程調(diào)用它的resume()方法恢復(fù)。
3、如果一個線程等待條件變量,如果要停止等待,需要條件變量所在的對象調(diào)用notify()或者notifyAll()方法。
4、特定的I/O指令結(jié)束不可運行狀態(tài)。
死亡狀態(tài)(Dead)線程的終止一般可通過兩種方法實現(xiàn):自然撤消(線程執(zhí)行完)或是被停止(調(diào)用stop()方法)。自然撤銷是線程的run()方法正常退出。
其它注意事項
1、非法狀態(tài)處理
對于任何狀態(tài),如果調(diào)用的方法和狀態(tài)不符,都會引起非法狀態(tài)處理異常。比如。線程剛創(chuàng)建后,只能調(diào)用start()或者stop()方法,如果調(diào)用其它方法就會引起非法狀態(tài)處理。
2、isAlive()方法
在類Thread中提供了方法isAlive(),如果線程已經(jīng)啟動,但是未終止,返回true,反之,返回false,表示該線程未啟動,或者已終止。
如果isAlive()方法返回true,不能區(qū)分是可運行態(tài)(runnable)還是不可運行態(tài)(notrunnable)。線程體的構(gòu)造
publicThread(Runnabletarget,Stringname);
target是執(zhí)行線程體的目標(biāo)對象。生成這個對象的類,實現(xiàn)了Runnable接口。其中包含線程體run()方法。
name是線程的名稱。
還有它的重載方法。
任何實現(xiàn)接口Runnable的對象都可以作為一個線程的目標(biāo)對象;構(gòu)造線程體的2種方法1.定義一個線程類,它繼承類Thread并重寫其中的方法run();提供一個實現(xiàn)接口Runnable的類作為線程的目標(biāo)對象,在初始化一個Thread類或者Thread子類的線程對象時,把目標(biāo)對象傳遞給這個線程實例,由該目標(biāo)對象提供線程體run()。2.Runnable接口中只定義了一個方法run();通過繼承類Thread構(gòu)造線程體classSimpleThreadextendsThread{publicSimpleThread(Stringstr){super(str);}publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i+""+getName());try{sleep((int)(Math.random()*1000));}catch(InterruptedExceptione){}}System.out.println("DONE!"+getName());}}publicclassTwoThreadsTest{publicstaticvoidmain(Stringargs[]){newSimpleThread("First").start();newSimpleThread("Second").start();}}通過接口構(gòu)造線程體-例子1classSimpleThreadimplementsRunnable{publicSimpleThread(Stringstr){//super(str);}publicvoidrun(){for(inti=0;i<10;i++){System.out.println(i+""+Thread.currentThread().getName());try{Thread.sleep((int)(Math.random()*1000));}catch(InterruptedExceptione){}}通過接口構(gòu)造線程體-例子1(續(xù))System.out.println("DONE!"+Thread.currentThread().getName());}}publicclassTwoThreadsTest1{publicstaticvoidmain(Stringargs[]){newThread(newSimpleThread(),"First").start();newThread(newSimpleThread(),“Second").start();}}兩種方法的比較
使用Runnable接口可以將CPU,代碼和數(shù)據(jù)分開,形成清晰的模型;還可以從其他類繼承;保持程序風(fēng)格的一致性。使用Thread.currentThread()獲取當(dāng)前線程進(jìn)行控制
直接繼承Thread類不能再從其他類繼承;編寫簡單,可以直接操縱線程兩種構(gòu)造線程方法之間的關(guān)系線程的調(diào)度
Java提供一個線程調(diào)度器來監(jiān)控程序中啟動后進(jìn)入就緒狀態(tài)的所有線程。線程調(diào)度器按照線程的優(yōu)先級決定應(yīng)調(diào)度哪些線程來執(zhí)行。
線程的調(diào)度是搶先式的。
時間片方式
非時間片方式
下面幾種情況下,當(dāng)前線程會放棄CPU:
線程調(diào)用了yield()或sleep()方法主動放棄;
由于當(dāng)前線程進(jìn)行I/O訪問,外存讀寫,等待用戶輸入等操作,導(dǎo)致線程阻塞;
為等候一個條件變量,線程調(diào)用wait()方法;
搶先式系統(tǒng)下,由高優(yōu)先級的線程參與調(diào)度;時間片方式下,當(dāng)前時間片用完,由同優(yōu)先級的線程參與調(diào)度。線程的優(yōu)先級
線程的優(yōu)先級用數(shù)字來表示,范圍從1到10,即Thread.MIN_PRIORITY到Thread.MAX_PRIORITY。一個線程的缺省優(yōu)先級是5,即Thread.NORM_PRIORITY。
intgetPriority();
voidsetPriority(intnewPriority);classThreadTest{publicstaticvoidmain(Stringargs[]){Threadt1=newMyThread("T1");t1.setPriority(Thread.MIN_PRIORITY);t1.start();Threadt2=newMyThread("T2");t2.setPriority(Thread.MAX_PRIORITY);t2.start();Threadt3=newMyThread("T3");t3.setPriority(Thread.MAX_PRIORITY);t3.start();}}classMyThreadextendsThread{Stringmessage;MyThread(Stringmessage){this.message=message;}publicvoidrun(){for(inti=0;i<3;i++)System.out.println(message+""+getPriority());}}運行結(jié)果:T2T2T2T3T3T3T1T1T1110101010101011
注意:并不是在所有系統(tǒng)中運行Java程序時都采用時間片策略調(diào)度線程,所以一個線程在空閑時應(yīng)該主動放棄CPU,以使其他同優(yōu)先級和低優(yōu)先級的線程得到執(zhí)行。基本的線程控制
測試線程狀態(tài)
可以通過Thread中的isAlive()方法來獲取線程是否處于活動狀態(tài);
線程由start()方法啟動后,直到其被終止之間的任何時刻,都處于‘Alive’狀態(tài)。線程的暫停和恢復(fù)
sleep()方法
suspend()和resume(),(運行程序)
join()(運行程序)當(dāng)前線程等待調(diào)用該方法的線程結(jié)束后,再恢復(fù)執(zhí)行.TimerThreadtt=newTimerThread(100);tt.start();…//另一線程publicvoidtimeout(){tt.join();//等待線程tt執(zhí)行完后再繼續(xù)往下執(zhí)行…}線程終止
終止線程
線程執(zhí)行完其run()方法后,會自然終止。
通過調(diào)用線程的實例方法stop()來終止線程。(一般不推薦使用)
使用中斷(interrupt)通知線程停止
interrupt();
isInterrupted();
interrupted();
查看備注程序多線程的互斥與同步線程1資源線程2變量線程10withdraw()余額withdraw()透支多線程的互斥與同步
臨界資源問題classstack{intidx=0;char[]data=newchar[6];publicvoidpush(charc){data[idx]=c;idx++;}publiccharpop(){idx--;returndata[idx];}}兩個線程A和B在同時使用Stack的同一個實例對象,A正在往堆棧里push一個數(shù)據(jù),B則要從堆棧中pop一個數(shù)據(jù)。1)操作之前data=|p|q|A執(zhí)行push中的第一個語句,將r推入堆棧;data=|p|q|r|||||idx=22)|||idx=23)A還未執(zhí)行idx++語句,A的執(zhí)行被B中斷,B執(zhí)行pop方法,返回q:data=|p|q|r||||idx=14〕A繼續(xù)執(zhí)行push的第二個語句:data=|p|q|r||,||idx=2最后的結(jié)果相當(dāng)于r沒有入棧。
產(chǎn)生這種問題的原因在于對共享數(shù)據(jù)訪問的操作的不完整性。
在Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性。
每個對象都對應(yīng)于一個可稱為“互斥鎖”的標(biāo)記,這個標(biāo)記用來保證在任一時刻,只能有一個線程訪問該對象。
關(guān)鍵字synchronized來與對象的互斥鎖聯(lián)系。當(dāng)某個對象用synchronized修飾時,表明該對象在任一時刻只能由一個線程訪問。publicvoidpush(charc){synchronized(this){data[idx]=c;idx++;}}publiccharpop(){synchronized(this){idx--;returndata[idx];}}
synchronized除了象上面講的放在對象前面限制一段代碼的執(zhí)行外,還可以放在方法聲明中,表示整個方法為同步方法。方法在執(zhí)行時需要獲取“互斥鎖”,是一個原子方法,不會被外界中斷。
publicsynchronizedvoidpush(charc){…}
如果synchronized用在類聲明中,則表明該類中的所有方法都是synchronized的。多線程的同步classSyncStack{privateintindex=0;privatechar[]buffer=newchar[6];publicsynchronizedvoidpush(charc){while(index==buffer.length){try{this.wait();}catch(InterruptedExceptione){}}this.notify();buffer[index]=c;index++;}publicsynchronizedcharpop(){while(index==0){try{this.wait();}catch(InterruptedExceptione){}}this.notify();index--;returnbuffer[index];}}生產(chǎn)者-消費者問題(同步問題)資源消費者生產(chǎn)者SyncStackclassProducerimplementsRunnable{SyncStacktheStack;publicProducer(SyncStacks){theStack=s;}publicvoidrun(){charc;for(inti=0;i<20;i++){c=(char)(Math.random()*26+'A');theStack.push(c);System.out.println("Produced:try{Thread.sleep((int)(Math.random()*100));}catch(InterruptedExceptione){}"+c);}}}classConsumerimplementsRunnable{SyncStacktheStack;publicConsumer(SyncStacks){theStack=s;}publicvoidrun(){charc;for(inti=0;i<20;i++){c=theStack.pop();System.out.println("Consumed:try{Thread.sleep((int)(Math.random()*1000));"+c);}catch(InterruptedExceptione){}}}}publicclassSyncTest{publicstaticvoidmain(Stringargs[]){SyncStackstack=newSyncStack();Runnablesource=newProducer(stack);Runnablesink=newConsumer(stack);Threadt1=newThread(source);Threadt2=newThread(sink);t1.start();t2.start();}}程序執(zhí)行結(jié)果Produced:VConsumed:VProduced:EConsumed:EProduced:PProduced:L...Consumed:LConsumed:Pwait(),notify(),notifyAll()(1)wait,nofity,notifyAll必須在已經(jīng)持有鎖的情況下執(zhí)行,所以它們只能出現(xiàn)在synchronized作用的范圍內(nèi).這些方法都是在java.lang.Object中定義的。(2)wait的作用:釋放已持有的鎖,進(jìn)入wait隊列.(3)notify的作用:喚醒wait隊列中的一個線程并把它移入鎖申請隊列.(4)notifyAll的作用:喚醒wait隊列中的所有的線程并把它們移入鎖申請隊列.可能會發(fā)生死鎖的問題
哲學(xué)家用餐問題
五位哲學(xué)家坐在餐桌前,他們在思考,并在感到饑餓時就吃東西,在每位哲學(xué)家之間有一個筷子,為了吃東西,一位哲學(xué)家必須要有兩個筷子,如果每位哲學(xué)家拿起右邊的筷子,然后等著拿左邊的筷子,問題就產(chǎn)生了.在這種情況下就會發(fā)生死鎖.JavaSE8.0Lambda語法對線程的支持對于Runnable和接口,除了可以使用Java中標(biāo)準(zhǔn)的方法來創(chuàng)建實現(xiàn)對象之外,還可以使用lambda表達(dá)式來創(chuàng)建實現(xiàn)對象,簡化代碼的實現(xiàn)。在使用lambda表達(dá)式時,只需要提供形式參數(shù)和方法體。由于函數(shù)式接口只有一個抽象方法,所以通過lambda表達(dá)式聲明的方法體就肯定是這個唯一的抽象方法的實現(xiàn),而且形式參數(shù)的類型可以根據(jù)方法的類型聲明進(jìn)行自動推斷。JavaSE8.0Lambda語法對線程的支持傳統(tǒng)匿名方式的創(chuàng)建一個線程并運行的方式如下所示:publicvoidrunThread(){newThread(newRunnable(){publicvoidrun(){System.out.println("Run!");}}).start();}JavaSE8.0Lambda語法對線程的支持使用lambda表達(dá)式來完成同樣的功能,得到的代碼非常簡潔,如下面所示:publicvoidrunThreadUseLambda(){newThread(()->{System.out.println("Run!");}).start();}*首先是Runnable接口的聲明,這可以通過對上下文環(huán)境進(jìn)行推斷來得出;其次是對run方法的實現(xiàn),因為函數(shù)式接口中只包含一個需要實現(xiàn)的方法。模擬考題Question1)WhichofthefollowingaremethodsoftheRerface1)run2)start3)yield4)stop模擬考題AnswertoQuestion1)1)TheRerfacehasonlyonemethodrunthatneedstobecreatedinany
溫馨提示
- 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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025合同模板學(xué)校食堂承包經(jīng)營合同范本
- Unit2 He's cool(說課稿)2023-2024學(xué)年外研版(三起)四年級下冊
- 2025合同模板工程的變更范本
- 2025江蘇:安全責(zé)任寫進(jìn)集體合同模板范本
- Unit1 School(說課稿)-2024-2025人教版(新起點)英語一年級上冊
- 2023七年級語文上冊 第四單元 綜合性學(xué)習(xí) 少年正是讀書時說課稿 新人教版
- Unit5 I'm cleaning my room(說課稿)-2023-2024學(xué)年人教精通版英語五年級下冊001
- 2024年九年級語文下冊 第二單元 第5課 孔乙己說課稿 新人教版
- 2024-2025學(xué)年高中化學(xué)下學(xué)期第20周 常見氣體的制備說課稿
- Unit 1 people of achievement Reading for writing 說課稿-2024-2025學(xué)年高中英語人教版(2019)選擇性必修第一冊
- 進(jìn)模模具設(shè)計
- 完整,滬教版小學(xué)四年級英語上冊單詞表
- 2021年高考化學(xué)真題和模擬題分類匯編專題20工業(yè)流程題含解析
- 2023年北京市高考作文評分標(biāo)準(zhǔn)及優(yōu)秀、滿分作文
- 2023年大唐尿素投標(biāo)文件
- 《鋼鐵是怎樣煉成的》名著閱讀(精講課件) 初中語文名著導(dǎo)讀
- 縮窄性心包炎課件
- 《工程電磁場》配套教學(xué)課件
- 職位管理手冊
- 東南大學(xué) 固體物理課件
- 行政人事助理崗位月度KPI績效考核表
評論
0/150
提交評論