版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、1. 線程的掛起和喚醒掛起實(shí)際上是讓線程進(jìn)入“非可執(zhí)行”狀態(tài)下,在這個(gè)狀態(tài)下CPU不會(huì)分給線程時(shí)間片,進(jìn)入這個(gè)狀態(tài)可以用來暫停一個(gè)線程的運(yùn)行;在線程掛起后, 可以通過重新喚醒線程來使之恢復(fù)運(yùn)行。掛起的原因可能是如下幾種情況:( 1)通過調(diào)用 sleep() 方法使線程進(jìn)入休眠狀態(tài),線程在指定時(shí)間內(nèi)不會(huì)運(yùn)行。( 2)通過調(diào)用 join() 方法使線程掛起,使自己等待另一個(gè)線程的結(jié)果,直到另一個(gè)線程執(zhí)行完畢為止。(3)通過調(diào)用wait()方法使線程掛起,直到線程得到了notify()和 notifyAll()消息,線程才會(huì)進(jìn)入“可執(zhí)行”狀態(tài)。(4)使用 suspend 掛起線程后,可以通過resu
2、me 方法喚醒線程。雖然 suspend 和 resume 可以很方便地使線程掛起和喚醒,但由于使用這兩個(gè)方法可能會(huì)造成死鎖,因此,這兩個(gè)方法被標(biāo)識(shí)為deprecated (抗議)標(biāo)記,這表明在以后的jdk版本中這兩個(gè)方法可能被刪除,所以盡量不要使用這兩個(gè)方法來操作線程。調(diào)用 sleep() 、 yield() 、 suspend() 的時(shí)候并沒有被釋放鎖調(diào)用 wait() 的時(shí)候釋放當(dāng)前對(duì)象的鎖wait()方法表示, 放棄當(dāng)前對(duì)資源的占有權(quán),一直等到有線程通知,才會(huì)運(yùn)行后面的代碼。notify()方法表示, 當(dāng)前的線程已經(jīng)放棄對(duì)資源的占有,通知等待的線程來獲得對(duì)資源的占有權(quán),但是只有一個(gè)線程
3、能夠從wait 狀態(tài)中恢復(fù),然后繼續(xù)運(yùn)行wait()后面的語(yǔ)句。notifyAll()方法表示,當(dāng)前的線程已經(jīng)放棄對(duì)資源的占有,通知所有的等待線程從wait()方法后的語(yǔ)句開始運(yùn)行。2. 等待和鎖實(shí)現(xiàn)資源競(jìng)爭(zhēng)1.2.3.4.5.6.1.2.3.4.等待機(jī)制與鎖機(jī)制是密切關(guān)聯(lián)的,對(duì)于需要競(jìng)爭(zhēng)的資源,首先用synchronized確保這段代碼只能一個(gè)線程執(zhí)行,可以再設(shè)置一個(gè)標(biāo)志位condition判斷該資源是否準(zhǔn)備好,如果沒有,則該線程釋放鎖,自己進(jìn)入等待狀態(tài),直到接收到notify,程序從 wait處繼續(xù)向下執(zhí)行。synchronized( obj )while(! condition)obj.
4、 wait();obj . doSomething();以上程序表示只有一個(gè)線程A 獲得了 obj 鎖后,發(fā)現(xiàn)條件 condition不滿足, 無法繼續(xù)下一處理,于是線程A 釋放該鎖,進(jìn)入wait()。在另一線程B 中,如果 B 更改了某些條件,使得線程A 的 condition條件滿足了, 就可以喚醒線程A:synchronized( obj )condition= true;obj . notify();需要注意的是:# 調(diào)用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) .代碼段內(nèi)。# 調(diào)用 obj.wait()后,線程
5、A 就釋放了obj 的鎖,否則線程B 無法獲得obj 鎖,也就無法在 synchronized(obj) .代碼段內(nèi)喚醒A。# 當(dāng) obj.wait()方法返回后,線程A 需要再次獲得obj 鎖,才能繼續(xù)執(zhí)行。#如果 A1,A2,A3 都在 obj.wait(),則 B 調(diào)用 obj.notify()只能喚醒 A1,A2,A3 中的一個(gè)( 具體哪一個(gè)由JVM決定 ) 。# obj.notifyAll()則能全部喚醒A1,A2,A3 ,但是要繼續(xù)執(zhí)行obj.wait()的下一條語(yǔ)句,必須獲得obj 鎖,因此, A1,A2,A3 只有一個(gè)有機(jī)會(huì)獲得鎖繼續(xù)執(zhí)行,例如A1,其余的需要等待 A1 釋放
6、obj 鎖之后才能繼續(xù)執(zhí)行。# 當(dāng) B 調(diào)用 obj.notify/notifyAll的時(shí)候, B 正持有 obj 鎖,因此, A1,A2,A3 雖被喚醒,但是仍無法獲得obj 鎖。直到 B 退出 synchronized塊,釋放 obj 鎖后, A1,A2,A3 中的一個(gè)才有機(jī)會(huì)獲得鎖繼續(xù)執(zhí)行。例 1:?jiǎn)蝹€(gè)線程對(duì)多個(gè)線程的喚醒假設(shè)只有一個(gè) Game對(duì)象,但有 3 個(gè)人要玩,由于只有一個(gè)游戲資源,必須必然依次玩。1./*2.* 玩游戲的人 .3.* version V1.0 ,2011-4-84.* author xiahui5.*/6.public classPlayerimplements
7、Runnable7.privatefinalintid ;8.privateGame game ;9.10.public Player( intid ,Game game )11.this. id=id ;12.this. game= game ;13.14.15.16.publicStringtoString()17.returnAthlete;18.19.20.publicinthashCode ()21.returnnew Integer( id ). hashCode();22.23.24.publicvoidplayGame ()throwsInterruptedException2
8、5.System . out . println( this. toString() + ready!);26.game. play( this);27.28.29.publicvoidrun ()30.try31.playGame();32. catch( InterruptedExceptione )33.System . out . println( this+ quit the game);34.35.36.游戲類,只實(shí)例化一個(gè)1.importjava. util. HashSet ;2.importjava. util. Iterator;3.importjava. util. Se
9、t ;4.5./*6.* 游戲類.7.* version V1.0 ,2011-4-88.* author xiahui9.*/10.publicclassGame implementsRunnable11.privatebooleanstart= false;12.13.publicvoidplay( Player player)throwsInterruptedException14.synchronized( this)15.while(!start)16.wait();17.if( start)18.System . out . println( player+ have played
10、!);19.20.21.22./通知所有玩家23.publicsynchronizedvoidbeginStart()24.start= true;25.notifyAll();26.27.28.publicvoidrun ()29.start= false;30.System . out . println( Ready.);31.System . out . println( Ready.);32.System . out . println( game start);33.beginStart();/ 通知所有玩家游戲準(zhǔn)備好了34.35.36.37.38.39.40.41.42.43.4
11、4.45.46.47.48.49.50.51.52.53.54.publicstaticvoidmain ( Stringargs)Set players= new HashSet ();/ 實(shí)例化一個(gè)游戲Game game= new Game ();/ 實(shí)例化 3 個(gè)玩家for( inti= 0 ; i 3 ; i +)players. add ( new Player( i , game );/ 啟動(dòng) 3 個(gè)玩家Iterator iter= players. iterator();while( iter. hasNext ()new Thread ( iter. next ().start
12、();Thread.sleep( 100);/ 游戲啟動(dòng)new Thread ( game). start();程序先啟動(dòng)玩家,三個(gè)玩家競(jìng)爭(zhēng)玩游戲,但只能有一個(gè)進(jìn)入play ,其他二個(gè)等待,進(jìn)入的玩家發(fā)現(xiàn)游戲未準(zhǔn)備好,所以wait ,等游戲準(zhǔn)備好后,依次玩。運(yùn)行結(jié)果1.Athlete ready!2.Athlete ready!3.Athlete ready!4.Ready.5.Ready.6.game start7.Athlete have played!8.Athlete have played!9.Athlete have played!3. 一次喚醒一個(gè)線程一次喚醒所有玩家,但只有一個(gè)
13、玩家能玩,不如一個(gè)一個(gè)喚醒將上面的代碼修改如下publicvoidplay ( Player player)throwsInterruptedExceptionsynchronized( this)while(! start)wait ();if( start)System . out . println( player+ have played!);notify();/ 玩完后,通知下一個(gè)玩家來玩/ 通知一個(gè)玩家publicsynchronizedvoidbeginStart()start= true;notify();4.suspend 掛起該方法已不建議使用,例子如下例 2:suspen
14、d 方法進(jìn)行掛起和喚醒1./*2.* suspend方法進(jìn)行掛起和喚醒 .3.* version V1.0 ,2011-3-274.* author xiahui5.*/6.public class SuspendThreadimplementsRunnable 7.publicvoidrun ()8.try9.Thread . sleep ( 10);10.catch( Exceptione )11.System . out . println( e );12.13.for( inti= 0 ; i= 1 ; i )14.System . out . println( Thread . cu
15、rrentThread().getName () : i );15.16.17.18.publicstaticvoidmain ( Stringargs)throwsException19.Threadth1=newThread ( new SuspendThread(),thread1);20.Threadth2=newThread ( new SuspendThread(),thread2);21.System . out . println( Starting th1 . getName (). );22.th1. start();23.System . out . println( S
16、uspending th1. getName ().);24./Suspend the thread.25.th1. suspend();26.th2. start();27.th2. join();28./ Resume the thread.29.th1. resume ();30.31.運(yùn)行結(jié)果1.Starting thread1.2.3.4.5.6.注意:Suspending thread1.thread2: 0thread2: 1thread1: 0thread1: 1如果注釋掉 /th2.join(); 則 thread2 運(yùn)行后,主線程會(huì)直接執(zhí)行 thread1 的 resume
17、,運(yùn)行結(jié)果可能會(huì)是1.2.3.4.5.6.Starting thread1.Suspending thread1.thread1: 0thread1: 1thread2: 0thread2: 11、 synchronized關(guān)鍵字的作用域有二種:1)是某個(gè)對(duì)象實(shí)例內(nèi),synchronized aMethod()可以防止多個(gè)線程同時(shí)訪問這個(gè)對(duì)象的synchronized方法(如果一個(gè)對(duì)象有多個(gè)synchronized方法,只要一個(gè)線程訪問了其中的一個(gè) synchronized方法,其它線程不能同時(shí)訪問這個(gè)對(duì)象中任何一個(gè)synchronized 方法)。這時(shí),不同的對(duì)象實(shí)例的synchronize
18、d方法是不相干擾的。也就是說,其它線程照樣可以同時(shí)訪問相同類的另一個(gè)對(duì)象實(shí)例中的synchronized 方法;2)是某個(gè)類的范圍, synchronized static aStaticMethod防止多個(gè)線程同時(shí)訪問這個(gè)類中的 synchronized static方法。它可以對(duì)類的所有對(duì)象實(shí)例起作用。2、除了方法前用synchronized關(guān)鍵字, synchronized關(guān)鍵字還可以用于方法中的某個(gè)區(qū)塊中,表示只對(duì)這個(gè)區(qū)塊的資源實(shí)行互斥訪問。用法是: synchronized(this)/*區(qū)塊 */ ,它的作用域是當(dāng)前對(duì)象;3、 synchronized關(guān)鍵字是不能繼承的,也就是說,基類的方法synchronized f()在繼承類中并不自動(dòng)是synchronizedf(),而是變成了 f()。繼承類需要你顯式的指定它的某個(gè)方法為 synchronized方法;/* synchronized用法* */publicclass SyncThreadextendsThreadprivateintval;publicSyncThread(intv)val = v;/ 同步加鎖的是對(duì)象,而不是代碼
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年皮頭項(xiàng)目可行性研究報(bào)告
- 2025年中國(guó)社交軟件行業(yè)投資潛力分析及行業(yè)發(fā)展趨勢(shì)報(bào)告
- 2025年羊絨混紡衫項(xiàng)目可行性研究報(bào)告
- 2025年碳鋼短接桿項(xiàng)目投資可行性研究分析報(bào)告
- 通訊系統(tǒng)課程設(shè)計(jì)報(bào)告
- 2025年中國(guó)石料破碎設(shè)備行業(yè)市場(chǎng)全景評(píng)估及投資前景展望報(bào)告
- 2025年中國(guó)鎂精密鑄件行業(yè)市場(chǎng)發(fā)展前景及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年限流型小型斷路器項(xiàng)目投資可行性研究分析報(bào)告
- 線上水果培訓(xùn)課程設(shè)計(jì)
- 2025年度山塘生態(tài)農(nóng)業(yè)承包合同4篇
- 項(xiàng)目工程師年終總結(jié)課件
- 一年級(jí)口算練習(xí)題大全(可直接打印A4)
- 電動(dòng)車棚消防應(yīng)急預(yù)案
- 人力資源戰(zhàn)略規(guī)劃地圖
- 2023年河南公務(wù)員考試申論試題(縣級(jí)卷)
- DB35T 2198-2024 工業(yè)園區(qū)低零碳創(chuàng)建評(píng)估準(zhǔn)則 福建省市監(jiān)局
- 不為積習(xí)所蔽勿為時(shí)尚所惑-如何做一個(gè) 好老師 高中主題班會(huì)課件
- 托育服務(wù)中心項(xiàng)目可行性研究報(bào)告
- 中式烹調(diào)師四級(jí)理論考試題庫(kù)(重點(diǎn)500題)
- 碳排放管理員 (碳排放核查員)技能考核內(nèi)容結(jié)構(gòu)表四級(jí)、技能考核要素細(xì)目表四級(jí)
- 物業(yè)五級(jí)三類服務(wù)統(tǒng)一標(biāo)準(zhǔn)
評(píng)論
0/150
提交評(píng)論