Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java多線(xiàn)程處理機(jī)制_第1頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java多線(xiàn)程處理機(jī)制_第2頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java多線(xiàn)程處理機(jī)制_第3頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java多線(xiàn)程處理機(jī)制_第4頁(yè)
Java面向?qū)ο蟪绦蛟O(shè)計(jì)案例教程課件:Java多線(xiàn)程處理機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩34頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Java多線(xiàn)程處理機(jī)制本講目標(biāo)進(jìn)程、線(xiàn)程的概念及區(qū)別創(chuàng)建線(xiàn)程的方式線(xiàn)程狀態(tài)線(xiàn)程調(diào)度和線(xiàn)程控制線(xiàn)程優(yōu)先級(jí)線(xiàn)程同步死鎖的概念使用wait()和notify()在線(xiàn)程之間進(jìn)行通信4進(jìn)程、線(xià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ò)程。線(xiàn)程的概念線(xiàn)程一般是對(duì)某一個(gè)程序而言的,如在進(jìn)行迅雷下載的同時(shí),還可以查看已經(jīng)下載的任務(wù)列表,這兩件事沒(méi)有相互干擾,那么我們說(shuō)此時(shí)這一程序中至少有兩個(gè)線(xiàn)程在運(yùn)行。那么線(xiàn)程可以理解為程序中的一個(gè)運(yùn)行分支。5進(jìn)程、線(xiàn)程的概念及區(qū)別進(jìn)程和線(xiàn)程的區(qū)別兩者的粒度不同,是兩個(gè)不同層次上的概念。進(jìn)程是由操作系統(tǒng)來(lái)管理的,而線(xiàn)程則是在一個(gè)程序(進(jìn)程)內(nèi)。不同進(jìn)程的代碼內(nèi)部數(shù)據(jù)和狀態(tài)都是完全獨(dú)立的,而一個(gè)程序內(nèi)的多線(xiàn)程是共享用一塊內(nèi)存空間和同一組系統(tǒng)資源,有可能互相影響進(jìn)程間的通信要比線(xiàn)程間的通信效率低。6進(jìn)程、線(xiàn)程的概念及區(qū)別多線(xiàn)程的概念多線(xiàn)程在Java中,一個(gè)應(yīng)用程序可以包含多個(gè)線(xiàn)程(多個(gè)分支)。每個(gè)線(xiàn)程執(zhí)行特定的任務(wù),并可與其他線(xiàn)程并發(fā)執(zhí)行

多線(xiàn)程使系統(tǒng)的空轉(zhuǎn)時(shí)間最少,提高CPU利用率多線(xiàn)程編程環(huán)境用方便的模型隱藏CPU在任務(wù)間切換的事實(shí)7進(jìn)程、線(xiàn)程的概念及區(qū)別多線(xiàn)程的概念主線(xiàn)程在Java程序啟動(dòng)時(shí),一個(gè)線(xiàn)程立刻運(yùn)行,該線(xiàn)程通常稱(chēng)為程序的主線(xiàn)程。主線(xiàn)程的重要性體現(xiàn)在兩個(gè)方面:它是產(chǎn)生其他子線(xiàn)程的線(xiàn)程。通常它必須最后完成執(zhí)行,因?yàn)樗鼒?zhí)行各種關(guān)閉動(dòng)作。8進(jìn)程、線(xiàn)程的概念及區(qū)別classMythreadextendsThread{publicstaticvoidmain(Stringargs[]){

Threadt=Thread.currentThread();System.out.println("當(dāng)前線(xiàn)程是:"+t);t.setName("MyJavaThread");System.out.println("當(dāng)前線(xiàn)程名是:"+t);try{for(inti=0;i<3;i++){System.out.println(i);Thread.sleep(1500);

}}catch(InterruptedExceptione){System.out.println("主線(xiàn)程被中斷");}}}獲得當(dāng)前線(xiàn)程,即主線(xiàn)程改變線(xiàn)程的內(nèi)部名稱(chēng)輸出每個(gè)數(shù)后暫停1500毫秒主線(xiàn)程案例9創(chuàng)建線(xiàn)程的方式j(luò)ava有兩種方式實(shí)現(xiàn)多線(xiàn)程編程繼承Thread類(lèi)實(shí)現(xiàn)Runnable接口10創(chuàng)建線(xiàn)程的方式方式一:繼承Thread類(lèi)實(shí)現(xiàn)步驟:繼承Thread類(lèi)覆蓋Thread的run()方法,將你要讓線(xiàn)程做的事寫(xiě)在run方法中。有時(shí)候可以需要用循環(huán),使你的代碼一直執(zhí)行下去。New這個(gè)Thead子類(lèi),得到一個(gè)對(duì)象調(diào)用這個(gè)對(duì)象的start()方法。線(xiàn)程被啟動(dòng),開(kāi)始執(zhí)行run()中的代碼。11創(chuàng)建線(xiàn)程的方式案例:實(shí)現(xiàn)一個(gè)定時(shí)線(xiàn)程,即線(xiàn)程在給定期間每隔一定時(shí)間(1秒),屏幕顯示時(shí)間累計(jì)數(shù)(秒數(shù)),時(shí)間結(jié)束時(shí)線(xiàn)程自動(dòng)停止、撤消。12創(chuàng)建線(xiàn)程的方式方式一:實(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)線(xiàn)程例如:runner.start();注意點(diǎn):由于繼承了Thread后,類(lèi)再不能繼承別的類(lèi),所以一般我們采用實(shí)現(xiàn)Runnable接口的方法來(lái)創(chuàng)建線(xiàn)程。13創(chuàng)建線(xiàn)程的方式案例:利用第一個(gè)方式(Runnable接口)實(shí)現(xiàn)一個(gè)定時(shí)線(xiàn)程。14創(chuàng)建線(xiàn)程的方式線(xiàn)程兩種創(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)建新線(xiàn)程,輸出0到100000。用繼承Thread的形式2、用實(shí)現(xiàn)Runnable接口的形式,創(chuàng)建線(xiàn)程,完成實(shí)現(xiàn)輸出task1、task2、task3。16線(xiàn)程的狀態(tài)線(xiàn)程狀態(tài)

新建(new):和其他java對(duì)象一樣,只分配內(nèi)存空間和初始化成員變量就緒(Runnable):調(diào)用了start()方法之后進(jìn)入就緒狀態(tài),什么時(shí)候運(yùn)行取決于線(xiàn)程的調(diào)度器運(yùn)行(Running):獲取時(shí)間片,開(kāi)始執(zhí)行run方法體阻塞(Blocked):失去cpu的占用權(quán),讓其他線(xiàn)程有機(jī)會(huì)運(yùn)行死亡(Dead):run方法體執(zhí)行完,正常結(jié)束或者拋出Exception或者調(diào)用stop()方法(不推薦)17線(xiàn)程的狀態(tài)18線(xiàn)程調(diào)度和線(xiàn)程控制線(xiàn)程的調(diào)度策略線(xiàn)程的基本控制19線(xiàn)程調(diào)度和線(xiàn)程控制線(xiàn)程的調(diào)度策略java中線(xiàn)程調(diào)度采用搶占式調(diào)度方法。搶占式調(diào)度模式:

許多線(xiàn)程可能是可運(yùn)行狀態(tài),但只能有一個(gè)線(xiàn)程在運(yùn)行,該線(xiàn)程將持續(xù)運(yùn)行,知道它自行終止或者是由于其他的事件導(dǎo)致阻塞亦或者是出現(xiàn)高優(yōu)先級(jí)線(xiàn)程成為可運(yùn)行的,則該線(xiàn)程失去CPU的占用權(quán)。20線(xiàn)程調(diào)度和線(xiàn)程控制方法方法說(shuō)明start()啟動(dòng)線(xiàn)程,使線(xiàn)程進(jìn)入可運(yùn)行狀態(tài)run()線(xiàn)程進(jìn)入運(yùn)行狀態(tài)getPriority()/setPriority()獲取/設(shè)置線(xiàn)程優(yōu)先級(jí)sleep()線(xiàn)程睡眠指定一段時(shí)間join()是Thread類(lèi)中的一個(gè)實(shí)例方法。一個(gè)線(xiàn)程調(diào)用另一個(gè)線(xiàn)程的join()方法可以使自己暫停運(yùn)行,直到另一個(gè)線(xiàn)程終止。yield()線(xiàn)程放棄執(zhí)行,使其他優(yōu)先級(jí)不低于此線(xiàn)程的線(xiàn)程有機(jī)會(huì)運(yùn)行,它是一個(gè)靜態(tài)方法線(xiàn)程的控制21線(xiàn)程調(diào)度和線(xiàn)程控制方法方法說(shuō)明wait()線(xiàn)程進(jìn)入等待狀態(tài),等待被notify,是一個(gè)實(shí)例方法。notify()/notifyAll()喚醒其他的線(xiàn)程,是一個(gè)實(shí)例方法suspend()掛起該線(xiàn)程(不推薦使用)resume()喚醒該線(xiàn)程,與suspend相對(duì)(不推薦使用)線(xiàn)程的控制22線(xiàn)程調(diào)度和線(xiàn)程控制線(xiàn)程的控制join()方法:

23線(xiàn)程調(diào)度和線(xiàn)程控制線(xiàn)程的控制yield()方法:線(xiàn)程放棄執(zhí)行,使其他優(yōu)先級(jí)不低于此線(xiàn)程的線(xiàn)程有機(jī)會(huì)運(yùn)行,它是一個(gè)靜態(tài)方法24線(xiàn)程調(diào)度和線(xiàn)程控制sleep()和wait()有什么區(qū)別?sleep是線(xiàn)程類(lèi)(thread)的方法,導(dǎo)致此線(xiàn)程暫停執(zhí)行指定時(shí)間,給執(zhí)行機(jī)會(huì)給其他線(xiàn)程,但是監(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)致本線(xiàn)程放棄對(duì)象鎖,進(jìn)入等待此對(duì)象的等待鎖定池,只有針對(duì)此對(duì)象發(fā)出notify方法(或notifyall)后本線(xiàn)程才進(jìn)入對(duì)象鎖定池準(zhǔn)備獲得對(duì)象鎖進(jìn)入運(yùn)行狀態(tài)。25線(xiàn)程調(diào)度和線(xiàn)程控制stop()和suspend()方法為何不推薦使用?反對(duì)使用stop(),是因?yàn)樗话踩K鼤?huì)解除由線(xiàn)程獲取的所有鎖定,而且如果對(duì)象處于一種不連貫狀態(tài),那么其他線(xiàn)程能在那種狀態(tài)下檢查和修改它們。結(jié)果很難檢查出真正的問(wèn)題所在。26線(xiàn)程調(diào)度和線(xiàn)程控制stop()和suspend()方法為何不推薦使用?suspend()方法容易發(fā)生死鎖。調(diào)用suspend()的時(shí)候,目標(biāo)線(xiàn)程會(huì)停下來(lái),但卻仍然持有在這之前獲得的鎖定。此時(shí),其他任何線(xiàn)程都不能訪(fǎng)問(wèn)鎖定的資源,除非被“掛起”的線(xiàn)程恢復(fù)運(yùn)行。對(duì)任何線(xiàn)程來(lái)說(shuō),如果它們想恢復(fù)目標(biāo)線(xiàn)程,同時(shí)又試圖使用任何一個(gè)鎖定的資源,就會(huì)造成死鎖。所以不應(yīng)該使用suspend(),而應(yīng)在自己的thread類(lèi)中置入一個(gè)標(biāo)志,指出線(xiàn)程應(yīng)該活動(dòng)還是掛起。若標(biāo)志指出線(xiàn)程應(yīng)該掛起,便用wait()命其進(jìn)入等待狀態(tài)。若標(biāo)志指出線(xiàn)程應(yīng)當(dāng)恢復(fù),則用一個(gè)notify()重新啟動(dòng)線(xiàn)程。27線(xiàn)程優(yōu)先級(jí)Java中的線(xiàn)程優(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):修改線(xiàn)程的當(dāng)前優(yōu)先級(jí)finalintgetPriority():返回線(xiàn)程的優(yōu)先級(jí)28線(xiàn)程優(yōu)先級(jí)線(xiàn)程繼承父類(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è)線(xiàn)程分別輸出0到3,但是3個(gè)線(xiàn)程要設(shè)為不同的優(yōu)先級(jí),分別為T(mén)hread.MAX_PRIORITY、Thread.NORM_PRIORITY、Thread.MIN_PRIORITY。測(cè)試是哪個(gè)線(xiàn)程優(yōu)先搶占cpu。30線(xiàn)程同步概念:有時(shí)兩個(gè)或多個(gè)線(xiàn)程可能會(huì)試圖同時(shí)訪(fǎng)問(wèn)一個(gè)資源例如,一個(gè)線(xiàn)程可能?chē)L試從一個(gè)文件中讀取數(shù)據(jù),而另一個(gè)線(xiàn)程則嘗試在同一文件中修改數(shù)據(jù)在此情況下,數(shù)據(jù)可能會(huì)變得不一致為了確保在任何時(shí)間點(diǎn)一個(gè)共享的資源只被一個(gè)線(xiàn)程使用,使用了“同步”31線(xiàn)程同步多線(xiàn)程訪(fǎng)問(wèn)共享資源案例:模擬售火車(chē)票過(guò)程32線(xiàn)程同步

如何在Java中獲得同步同步基于“監(jiān)視器”這一概念?!氨O(jiān)視器”是用作互斥鎖的對(duì)象。在給定時(shí)刻,只有一個(gè)線(xiàn)程可以擁有監(jiān)視器。Java中所有的對(duì)象都擁有自己的監(jiān)視器兩種方式實(shí)現(xiàn)同步:使用同步方法synchronizedvoidmethodA(){}使用同步塊synchronized(object){ //要同步的語(yǔ)句}331、使用線(xiàn)程同步解決買(mǎi)票過(guò)程出現(xiàn)的問(wèn)題。34死鎖當(dāng)兩個(gè)線(xiàn)程循環(huán)依賴(lài)于一對(duì)同步對(duì)象時(shí)將發(fā)生死鎖。

例如:

有兩個(gè)鎖A,B,一個(gè)線(xiàn)程拿到A鎖,請(qǐng)求B鎖。另一個(gè)線(xiàn)程拿到B鎖,請(qǐng)求A鎖。那么,這兩個(gè)線(xiàn)程將進(jìn)入死鎖。進(jìn)入死鎖,即程序死掉了。死鎖很少發(fā)生,但一旦發(fā)生就很難調(diào)試。351、死鎖案例演示36使用wait()、notify()在線(xiàn)程間通信

wait-notify機(jī)制-1為避免輪流檢測(cè),Java提供了一個(gè)精心設(shè)計(jì)的線(xiàn)程間通信機(jī)制,使用wait()、notify()和notifyAll()方法這些方法是作為Object類(lèi)中的final方法實(shí)現(xiàn)的這三個(gè)方法僅在synchronized方法中才能被調(diào)用37使用wait()和notify()在線(xiàn)程間通信wait-notify機(jī)制-2wait()方法告知被調(diào)用的線(xiàn)程退出監(jiān)視器并進(jìn)入等待狀態(tài),直到其他線(xiàn)程進(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論