版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java多線程處理機(jī)制本講目標(biāo)進(jìn)程、線程的概念及區(qū)別創(chuàng)建線程的方式線程狀態(tài)線程調(diào)度和線程控制線程優(yōu)先級(jí)線程同步死鎖的概念使用wait()和notify()在線程之間進(jìn)行通信4進(jìn)程、線程的概念及區(qū)別進(jìn)程的概念進(jìn)程一般是對(duì)操作系統(tǒng)而言。例如在windows操作系統(tǒng)中,你打開(kāi)word編輯文檔的同時(shí),可以進(jìn)行迅雷下載。我們可以說(shuō)此時(shí)系統(tǒng)內(nèi)部有兩個(gè)進(jìn)程在運(yùn)行。即windows操作系統(tǒng)是多任務(wù)操作系統(tǒng)。那么進(jìn)程可以理解為程序的一次動(dòng)態(tài)執(zhí)行過(guò)程。線程的概念線程一般是對(duì)某一個(gè)程序而言的,如在進(jìn)行迅雷下載的同時(shí),還可以查看已經(jīng)下載的任務(wù)列表,這兩件事沒(méi)有相互干擾,那么我們說(shuō)此時(shí)這一程序中至少有兩個(gè)線程在運(yùn)行。那么線程可以理解為程序中的一個(gè)運(yùn)行分支。5進(jìn)程、線程的概念及區(qū)別進(jìn)程和線程的區(qū)別兩者的粒度不同,是兩個(gè)不同層次上的概念。進(jìn)程是由操作系統(tǒng)來(lái)管理的,而線程則是在一個(gè)程序(進(jìn)程)內(nèi)。不同進(jìn)程的代碼內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的,而一個(gè)程序內(nèi)的多線程是共享用一塊內(nèi)存空間和同一組系統(tǒng)資源,有可能互相影響進(jìn)程間的通信要比線程間的通信效率低。6進(jìn)程、線程的概念及區(qū)別多線程的概念多線程在Java中,一個(gè)應(yīng)用程序可以包含多個(gè)線程(多個(gè)分支)。每個(gè)線程執(zhí)行特定的任務(wù),并可與其他線程并發(fā)執(zhí)行
多線程使系統(tǒng)的空轉(zhuǎn)時(shí)間最少,提高CPU利用率多線程編程環(huán)境用方便的模型隱藏CPU在任務(wù)間切換的事實(shí)7進(jìn)程、線程的概念及區(qū)別多線程的概念主線程在Java程序啟動(dòng)時(shí),一個(gè)線程立刻運(yùn)行,該線程通常稱(chēng)為程序的主線程。主線程的重要性體現(xiàn)在兩個(gè)方面:它是產(chǎn)生其他子線程的線程。通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動(dòng)作。8進(jìn)程、線程的概念及區(qū)別classMythreadextendsThread{publicstaticvoidmain(Stringargs[]){
Threadt=Thread.currentThread();System.out.println("當(dāng)前線程是:"+t);t.setName("MyJavaThread");System.out.println("當(dāng)前線程名是:"+t);try{for(inti=0;i<3;i++){System.out.println(i);Thread.sleep(1500);
}}catch(InterruptedExceptione){System.out.println("主線程被中斷");}}}獲得當(dāng)前線程,即主線程改變線程的內(nèi)部名稱(chēng)輸出每個(gè)數(shù)后暫停1500毫秒主線程案例9創(chuàng)建線程的方式j(luò)ava有兩種方式實(shí)現(xiàn)多線程編程繼承Thread類(lèi)實(shí)現(xiàn)Runnable接口10創(chuàng)建線程的方式方式一:繼承Thread類(lèi)實(shí)現(xiàn)步驟:繼承Thread類(lèi)覆蓋Thread的run()方法,將你要讓線程做的事寫(xiě)在run方法中。有時(shí)候可以需要用循環(huán),使你的代碼一直執(zhí)行下去。New這個(gè)Thead子類(lèi),得到一個(gè)對(duì)象調(diào)用這個(gè)對(duì)象的start()方法。線程被啟動(dòng),開(kāi)始執(zhí)行run()中的代碼。11創(chuàng)建線程的方式案例:實(shí)現(xiàn)一個(gè)定時(shí)線程,即線程在給定期間每隔一定時(shí)間(1秒),屏幕顯示時(shí)間累計(jì)數(shù)(秒數(shù)),時(shí)間結(jié)束時(shí)線程自動(dòng)停止、撤消。12創(chuàng)建線程的方式方式一:實(shí)現(xiàn)Runnable接口實(shí)現(xiàn)步驟:提供一個(gè)實(shí)現(xiàn)接口Runnable的類(lèi),實(shí)現(xiàn)run()方法。得到這個(gè)類(lèi)的實(shí)例A。New一個(gè)Thread對(duì)象,同時(shí)A作為參數(shù)傳入。例如:Threadrunner=newThread(A);調(diào)用start啟動(dòng)線程例如:runner.start();注意點(diǎn):由于繼承了Thread后,類(lèi)再不能繼承別的類(lèi),所以一般我們采用實(shí)現(xiàn)Runnable接口的方法來(lái)創(chuàng)建線程。13創(chuàng)建線程的方式案例:利用第一個(gè)方式(Runnable接口)實(shí)現(xiàn)一個(gè)定時(shí)線程。14創(chuàng)建線程的方式線程兩種創(chuàng)建方式的比較實(shí)現(xiàn)Runnable接口的優(yōu)勢(shì)符合OO設(shè)計(jì)思想便于用extends繼承其他類(lèi)采用繼承Thread類(lèi)方法的優(yōu)點(diǎn):程序代碼更簡(jiǎn)單151、創(chuàng)建新線程,輸出0到100000。用繼承Thread的形式2、用實(shí)現(xiàn)Runnable接口的形式,創(chuàng)建線程,完成實(shí)現(xiàn)輸出task1、task2、task3。16線程的狀態(tài)線程狀態(tài)
新建(new):和其他java對(duì)象一樣,只分配內(nèi)存空間和初始化成員變量就緒(Runnable):調(diào)用了start()方法之后進(jìn)入就緒狀態(tài),什么時(shí)候運(yùn)行取決于線程的調(diào)度器運(yùn)行(Running):獲取時(shí)間片,開(kāi)始執(zhí)行run方法體阻塞(Blocked):失去cpu的占用權(quán),讓其他線程有機(jī)會(huì)運(yùn)行死亡(Dead):run方法體執(zhí)行完,正常結(jié)束或者拋出Exception或者調(diào)用stop()方法(不推薦)17線程的狀態(tài)18線程調(diào)度和線程控制線程的調(diào)度策略線程的基本控制19線程調(diào)度和線程控制線程的調(diào)度策略java中線程調(diào)度采用搶占式調(diào)度方法。搶占式調(diào)度模式:
許多線程可能是可運(yùn)行狀態(tài),但只能有一個(gè)線程在運(yùn)行,該線程將持續(xù)運(yùn)行,知道它自行終止或者是由于其他的事件導(dǎo)致阻塞亦或者是出現(xiàn)高優(yōu)先級(jí)線程成為可運(yùn)行的,則該線程失去CPU的占用權(quán)。20線程調(diào)度和線程控制方法方法說(shuō)明start()啟動(dòng)線程,使線程進(jìn)入可運(yùn)行狀態(tài)run()線程進(jìn)入運(yùn)行狀態(tài)getPriority()/setPriority()獲取/設(shè)置線程優(yōu)先級(jí)sleep()線程睡眠指定一段時(shí)間join()是Thread類(lèi)中的一個(gè)實(shí)例方法。一個(gè)線程調(diào)用另一個(gè)線程的join()方法可以使自己暫停運(yùn)行,直到另一個(gè)線程終止。yield()線程放棄執(zhí)行,使其他優(yōu)先級(jí)不低于此線程的線程有機(jī)會(huì)運(yùn)行,它是一個(gè)靜態(tài)方法線程的控制21線程調(diào)度和線程控制方法方法說(shuō)明wait()線程進(jìn)入等待狀態(tài),等待被notify,是一個(gè)實(shí)例方法。notify()/notifyAll()喚醒其他的線程,是一個(gè)實(shí)例方法suspend()掛起該線程(不推薦使用)resume()喚醒該線程,與suspend相對(duì)(不推薦使用)線程的控制22線程調(diào)度和線程控制線程的控制join()方法:
23線程調(diào)度和線程控制線程的控制yield()方法:線程放棄執(zhí)行,使其他優(yōu)先級(jí)不低于此線程的線程有機(jī)會(huì)運(yùn)行,它是一個(gè)靜態(tài)方法24線程調(diào)度和線程控制sleep()和wait()有什么區(qū)別?sleep是線程類(lèi)(thread)的方法,導(dǎo)致此線程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線程,但是監(jiān)控狀態(tài)依然保持,到時(shí)后會(huì)自動(dòng)恢復(fù)。調(diào)用sleep不會(huì)釋放對(duì)象鎖。wait是object類(lèi)的方法,對(duì)此對(duì)象調(diào)用wait方法導(dǎo)致本線程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyall)后本線程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。25線程調(diào)度和線程控制stop()和suspend()方法為何不推薦使用?反對(duì)使用stop(),是因?yàn)樗话踩K鼤?huì)解除由線程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問(wèn)題所在。26線程調(diào)度和線程控制stop()和suspend()方法為何不推薦使用?suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線程都不能訪問(wèn)鎖定的資源,除非被“掛起”的線程恢復(fù)運(yùn)行。對(duì)任何線程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的thread類(lèi)中置入一個(gè)標(biāo)志,指出線程應(yīng)該活動(dòng)還是掛起。若標(biāo)志指出線程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線程應(yīng)當(dāng)恢復(fù),則用一個(gè)notify()重新啟動(dòng)線程。27線程優(yōu)先級(jí)Java中的線程優(yōu)先級(jí)是在Thread類(lèi)中定義的常量NORM_PRIORITY:值為5MAX_PRIORITY:值為10MIN_PRIORITY:值為1缺省優(yōu)先級(jí)為NORM_PRIORITY有關(guān)優(yōu)先級(jí)的方法有兩個(gè):finalvoidsetPriority(intnewp):修改線程的當(dāng)前優(yōu)先級(jí)finalintgetPriority():返回線程的優(yōu)先級(jí)28線程優(yōu)先級(jí)線程繼承父類(lèi)的優(yōu)先級(jí)有關(guān)優(yōu)先級(jí)的原則:優(yōu)先級(jí)高者優(yōu)先優(yōu)先級(jí)相同的“先進(jìn)先出”切換規(guī)則:自動(dòng)放棄高優(yōu)先權(quán)搶占291、創(chuàng)建3個(gè)線程分別輸出0到3,但是3個(gè)線程要設(shè)為不同的優(yōu)先級(jí),分別為T(mén)hread.MAX_PRIORITY、Thread.NORM_PRIORITY、Thread.MIN_PRIORITY。測(cè)試是哪個(gè)線程優(yōu)先搶占cpu。30線程同步概念:有時(shí)兩個(gè)或多個(gè)線程可能會(huì)試圖同時(shí)訪問(wèn)一個(gè)資源例如,一個(gè)線程可能?chē)L試從一個(gè)文件中讀取數(shù)據(jù),而另一個(gè)線程則嘗試在同一文件中修改數(shù)據(jù)在此情況下,數(shù)據(jù)可能會(huì)變得不一致為了確保在任何時(shí)間點(diǎn)一個(gè)共享的資源只被一個(gè)線程使用,使用了“同步”31線程同步多線程訪問(wèn)共享資源案例:模擬售火車(chē)票過(guò)程32線程同步
如何在Java中獲得同步同步基于“監(jiān)視器”這一概念。“監(jiān)視器”是用作互斥鎖的對(duì)象。在給定時(shí)刻,只有一個(gè)線程可以擁有監(jiān)視器。Java中所有的對(duì)象都擁有自己的監(jiān)視器兩種方式實(shí)現(xiàn)同步:使用同步方法synchronizedvoidmethodA(){}使用同步塊synchronized(object){ //要同步的語(yǔ)句}331、使用線程同步解決買(mǎi)票過(guò)程出現(xiàn)的問(wèn)題。34死鎖當(dāng)兩個(gè)線程循環(huán)依賴(lài)于一對(duì)同步對(duì)象時(shí)將發(fā)生死鎖。
例如:
有兩個(gè)鎖A,B,一個(gè)線程拿到A鎖,請(qǐng)求B鎖。另一個(gè)線程拿到B鎖,請(qǐng)求A鎖。那么,這兩個(gè)線程將進(jìn)入死鎖。進(jìn)入死鎖,即程序死掉了。死鎖很少發(fā)生,但一旦發(fā)生就很難調(diào)試。351、死鎖案例演示36使用wait()、notify()在線程間通信
wait-notify機(jī)制-1為避免輪流檢測(cè),Java提供了一個(gè)精心設(shè)計(jì)的線程間通信機(jī)制,使用wait()、notify()和notifyAll()方法這些方法是作為Object類(lèi)中的final方法實(shí)現(xiàn)的這三個(gè)方法僅在synchronized方法中才能被調(diào)用37使用wait()和notify()在線程間通信wait-notify機(jī)制-2wait()方法告知被調(diào)用的線程退出監(jiān)視器并進(jìn)入等待狀態(tài),直到其他線程進(jìn)入相
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《診斷學(xué)胸部評(píng)估》課件
- 2024年黑龍江省《消防員資格證之一級(jí)防火考試》必刷500題標(biāo)準(zhǔn)卷
- 中級(jí)微觀經(jīng)濟(jì)學(xué)范里安課件ch
- 2024年高考生物必修全部和選修1基礎(chǔ)知識(shí)清單(以問(wèn)題串形式呈現(xiàn))含答案
- 單位管理制度集粹匯編【人事管理】十篇
- 《盆景制作與欣賞》課件
- 單位管理制度匯編大合集【人力資源管理篇】
- 高中語(yǔ)文文言文閱讀部分
- 單位管理制度范例選集【職工管理】十篇
- 單位管理制度范例合集【人員管理】十篇
- 滬科版九年級(jí)物理下冊(cè)教案全冊(cè)
- PAS 2050:2011-商品和服務(wù)在生命周期內(nèi)的溫室氣體排放評(píng)價(jià)規(guī)范(英文)
- 歷史期中復(fù)習(xí)課件八年級(jí)上冊(cè)復(fù)習(xí)課件(統(tǒng)編版)
- 幕墻作業(yè)安全技術(shù)交底
- 保護(hù)性約束完整版本
- 埃森哲流程制造-智能工廠規(guī)劃設(shè)計(jì)相關(guān)兩份資料
- 國(guó)家開(kāi)放大學(xué)電大《供應(yīng)鏈管理》期末題庫(kù)及答案
- 10萬(wàn)噸綠色航空煤油項(xiàng)目可行性研究報(bào)告寫(xiě)作模板-備案審批
- 物業(yè)服務(wù)水電維修方案
- 2024至2030年中國(guó)生活用紙機(jī)械行業(yè)市場(chǎng)深度分析及發(fā)展趨勢(shì)預(yù)測(cè)報(bào)告
- 2024-2030年中國(guó)蔬菜種植市場(chǎng)發(fā)展方向及前景需求趨勢(shì)報(bào)告
評(píng)論
0/150
提交評(píng)論