996第十三章 并發(fā)_第1頁(yè)
996第十三章 并發(fā)_第2頁(yè)
996第十三章 并發(fā)_第3頁(yè)
996第十三章 并發(fā)_第4頁(yè)
996第十三章 并發(fā)_第5頁(yè)
已閱讀5頁(yè),還剩45頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第十三章第十三章 并發(fā)并發(fā)2線程的概念線程的概念線程的創(chuàng)建線程的創(chuàng)建線程調(diào)度與線程控制線程調(diào)度與線程控制線程同步線程同步線程狀態(tài)與生命周期線程狀態(tài)與生命周期3什么是線程什么是線程多線程是實(shí)現(xiàn)并發(fā)的一種有效手段。多線程是實(shí)現(xiàn)并發(fā)的一種有效手段。一個(gè)進(jìn)程可以通過(guò)運(yùn)行多個(gè)線程來(lái)并發(fā)地執(zhí)行多項(xiàng)任務(wù)。一個(gè)進(jìn)程可以通過(guò)運(yùn)行多個(gè)線程來(lái)并發(fā)地執(zhí)行多項(xiàng)任務(wù)。多個(gè)線程如何調(diào)度執(zhí)行由系統(tǒng)來(lái)實(shí)現(xiàn)。多個(gè)線程如何調(diào)度執(zhí)行由系統(tǒng)來(lái)實(shí)現(xiàn)。4什么是線程什么是線程線程是程序中的單個(gè)執(zhí)行流,多線程是一個(gè)程序線程是程序中的單個(gè)執(zhí)行流,多線程是一個(gè)程序 中包含中包含的多個(gè)同時(shí)運(yùn)行的執(zhí)行流。的多個(gè)同時(shí)運(yùn)行的執(zhí)行流。5線程與進(jìn)程線程與進(jìn)

2、程進(jìn)程:內(nèi)核級(jí)的實(shí)體。包含虛存映象、文件指示符,進(jìn)程:內(nèi)核級(jí)的實(shí)體。包含虛存映象、文件指示符,用戶用戶id等。這些結(jié)構(gòu)都在內(nèi)核空間中,用戶程序等。這些結(jié)構(gòu)都在內(nèi)核空間中,用戶程序只有通過(guò)系統(tǒng)調(diào)用才能訪問(wèn)與改變。只有通過(guò)系統(tǒng)調(diào)用才能訪問(wèn)與改變。線程:用戶級(jí)的實(shí)體。線程結(jié)構(gòu)駐留在用戶空間中,線程:用戶級(jí)的實(shí)體。線程結(jié)構(gòu)駐留在用戶空間中,能夠被普通的用戶級(jí)函數(shù)組成的線程庫(kù)直接訪問(wèn)。能夠被普通的用戶級(jí)函數(shù)組成的線程庫(kù)直接訪問(wèn)。寄存器(棧指針,程序計(jì)數(shù)器)是線程專有的成分。寄存器(棧指針,程序計(jì)數(shù)器)是線程專有的成分。一個(gè)進(jìn)程中的所有線程共享該進(jìn)程的狀態(tài)。一個(gè)進(jìn)程中的所有線程共享該進(jìn)程的狀態(tài)。6cpuc

3、odedata一個(gè)虛擬的一個(gè)虛擬的cpu,代碼所操作的數(shù)據(jù):數(shù)據(jù)也可以代碼所操作的數(shù)據(jù):數(shù)據(jù)也可以 被多個(gè)線程共享。被多個(gè)線程共享。該該cpu執(zhí)行的代碼:執(zhí)行的代碼: 代碼與數(shù)據(jù)是相互獨(dú)立的,代代碼與數(shù)據(jù)是相互獨(dú)立的,代 碼可以與其它線程共享。碼可以與其它線程共享。 java 中線程被認(rèn)為是一個(gè)中線程被認(rèn)為是一個(gè)cpu、程序代碼、和數(shù)據(jù)、程序代碼、和數(shù)據(jù)的封裝體。的封裝體。java中的線程中的線程7 java.lang.thread類使用戶可以創(chuàng)建和控制自己的線程。類使用戶可以創(chuàng)建和控制自己的線程。在在java中,虛擬中,虛擬cpu是自動(dòng)封裝進(jìn)是自動(dòng)封裝進(jìn)thread類的實(shí)例中,類的實(shí)例中,

4、而而code和和data要通過(guò)一個(gè)對(duì)象傳給要通過(guò)一個(gè)對(duì)象傳給thread類的構(gòu)造函數(shù)。類的構(gòu)造函數(shù)。線程的構(gòu)造線程的構(gòu)造8線程的創(chuàng)建線程的創(chuàng)建 線程的線程的code和和data構(gòu)成線程體。線程體決定了線程的行為。構(gòu)成線程體。線程體決定了線程的行為。 java中線程體由中線程體由thread類的類的 run( ) 方法定義,該方法方法定義,該方法 定義了線程的具體行為并指定了線程要操作的數(shù)據(jù)。定義了線程的具體行為并指定了線程要操作的數(shù)據(jù)。有兩種方式進(jìn)行有兩種方式進(jìn)行run( )方法的定義:方法的定義: 實(shí)現(xiàn)實(shí)現(xiàn) runnable 接口接口繼承繼承 thread 類類9 runnable 接口只提

5、供了一個(gè)接口只提供了一個(gè)public void run( )方法。方法。定義一個(gè)類實(shí)現(xiàn)定義一個(gè)類實(shí)現(xiàn)runnable接口。接口。將該類的實(shí)例作為參數(shù)傳給將該類的實(shí)例作為參數(shù)傳給thread類的一個(gè)構(gòu)造函數(shù),類的一個(gè)構(gòu)造函數(shù),從而創(chuàng)建一個(gè)線程。從而創(chuàng)建一個(gè)線程。通過(guò)實(shí)現(xiàn)通過(guò)實(shí)現(xiàn)runnable 接口創(chuàng)建線程接口創(chuàng)建線程10public class threadtest public static void main(string args )xyz r= new xyz( );thread t = new thread( r );t.start( );class xyz implements r

6、unnable int i ; public void run( )while( true)system.out.println(“hello”+i+);if (i=5) break ; 線程創(chuàng)建示例線程創(chuàng)建示例11cpucodedata線程線程 txyz類類xyz的實(shí)例的實(shí)例 r 一個(gè)線程就是一個(gè)線程就是thread類的一個(gè)實(shí)例。類的一個(gè)實(shí)例。線程是從一個(gè)傳遞給線程的線程是從一個(gè)傳遞給線程的runnable實(shí)例的實(shí)例的run( )方法開(kāi)始執(zhí)行。方法開(kāi)始執(zhí)行。線程所操作的數(shù)據(jù)是來(lái)自于該線程所操作的數(shù)據(jù)是來(lái)自于該runnable 類的實(shí)例。類的實(shí)例。線程創(chuàng)建示例線程創(chuàng)建示例12通過(guò)繼承通過(guò)繼承t

7、hread類創(chuàng)建線程類創(chuàng)建線程 thread 類本身實(shí)現(xiàn)了類本身實(shí)現(xiàn)了runnable接口。接口。通過(guò)繼承通過(guò)繼承thread類,重寫其中的類,重寫其中的run( )方法定義線程體。方法定義線程體。創(chuàng)建該子類的對(duì)象創(chuàng)建線程。創(chuàng)建該子類的對(duì)象創(chuàng)建線程。public class counter extends thread public void run( ) 創(chuàng)建與運(yùn)行線程:創(chuàng)建與運(yùn)行線程:counter threadcounter = new counter( );threadcounter.start( );13線程兩種創(chuàng)建方法比較線程兩種創(chuàng)建方法比較實(shí)現(xiàn)實(shí)現(xiàn)runnable接口的優(yōu)勢(shì):接口

8、的優(yōu)勢(shì):符合符合oo設(shè)計(jì)的思想。設(shè)計(jì)的思想。便于用便于用extends繼承其它類。繼承其它類。采用繼承采用繼承thread類方法的優(yōu)點(diǎn):程序代碼更簡(jiǎn)單。類方法的優(yōu)點(diǎn):程序代碼更簡(jiǎn)單。提倡采用第一種方式。提倡采用第一種方式。14線程的運(yùn)行線程的運(yùn)行新創(chuàng)建的線程不會(huì)自動(dòng)運(yùn)行。必須調(diào)用線程的新創(chuàng)建的線程不會(huì)自動(dòng)運(yùn)行。必須調(diào)用線程的start( )方法方法,如:如:t.start( )該方法的調(diào)用把嵌入在線程中的虛擬該方法的調(diào)用把嵌入在線程中的虛擬cpu置為可運(yùn)行置為可運(yùn)行(runnable)狀態(tài)。狀態(tài)。 runnable狀態(tài)意味著該線程可以參加調(diào)度,被狀態(tài)意味著該線程可以參加調(diào)度,被jvm運(yùn)行,運(yùn)行

9、,并不意味著線程會(huì)立即執(zhí)行。并不意味著線程會(huì)立即執(zhí)行。15線程調(diào)度與線程控制線程調(diào)度與線程控制線程調(diào)度策略線程調(diào)度策略線程的基本控制線程的基本控制16線程調(diào)度策略線程調(diào)度策略 java中線程調(diào)度采用搶先式調(diào)度方法。中線程調(diào)度采用搶先式調(diào)度方法。搶先式調(diào)度模式:搶先式調(diào)度模式: 許多線程可能是可運(yùn)行的,但只能有一個(gè)線程在運(yùn)行。許多線程可能是可運(yùn)行的,但只能有一個(gè)線程在運(yùn)行。該線程將持續(xù)運(yùn)行,直到它自行中止或出現(xiàn)高優(yōu)先級(jí)該線程將持續(xù)運(yùn)行,直到它自行中止或出現(xiàn)高優(yōu)先級(jí)線程成為可運(yùn)行的,則該低優(yōu)先級(jí)線程被高優(yōu)先級(jí)線程線程成為可運(yùn)行的,則該低優(yōu)先級(jí)線程被高優(yōu)先級(jí)線程強(qiáng)占運(yùn)行。強(qiáng)占運(yùn)行。線程中止的原因可能

10、有多種,如執(zhí)行線程中止的原因可能有多種,如執(zhí)行thread.sleep( )調(diào)用,調(diào)用,或等待訪問(wèn)共享的資源?;虻却L問(wèn)共享的資源。17線程的優(yōu)先級(jí)線程的優(yōu)先級(jí)每個(gè)線程都有優(yōu)先級(jí),有缺省值,可用每個(gè)線程都有優(yōu)先級(jí),有缺省值,可用 setpriority( )方法改變。方法改變。每個(gè)優(yōu)先級(jí)有一個(gè)等待池:每個(gè)優(yōu)先級(jí)有一個(gè)等待池:poolpoolpoolt1t2t3.18線程調(diào)度策略線程調(diào)度策略 jvm先運(yùn)行高優(yōu)先級(jí)池中的線程,待該池空后才先運(yùn)行高優(yōu)先級(jí)池中的線程,待該池空后才 考慮低優(yōu)先級(jí)線程。考慮低優(yōu)先級(jí)線程。如果有高優(yōu)先級(jí)線程成為可運(yùn)行的,則運(yùn)行它。如果有高優(yōu)先級(jí)線程成為可運(yùn)行的,則運(yùn)行它。搶

11、先式可能是分時(shí)的,即每個(gè)池中的線程輪流運(yùn)行;搶先式可能是分時(shí)的,即每個(gè)池中的線程輪流運(yùn)行; 也可能不是,即線程逐個(gè)運(yùn)行,由也可能不是,即線程逐個(gè)運(yùn)行,由jvm而定。而定。線程一般可用線程一般可用sleep( )保證給其他線程運(yùn)行時(shí)間。保證給其他線程運(yùn)行時(shí)間。19線程的基本控制線程的基本控制結(jié)束線程結(jié)束線程獲取當(dāng)前線程獲取當(dāng)前線程測(cè)試線程測(cè)試線程 sleep( ) join( ) yield( )20結(jié)束線程結(jié)束線程線程完成運(yùn)行并結(jié)束后,將不能再運(yùn)行。線程完成運(yùn)行并結(jié)束后,將不能再運(yùn)行。除正常運(yùn)行結(jié)束外,還可用其他方法控制使其停止。除正常運(yùn)行結(jié)束外,還可用其他方法控制使其停止。用用stop( )

12、方法。方法。 強(qiáng)行終止線程,容易造成線程的不一致。強(qiáng)行終止線程,容易造成線程的不一致。使用標(biāo)志使用標(biāo)志flag。 通過(guò)設(shè)置通過(guò)設(shè)置flag 指明指明run( )方法應(yīng)該結(jié)束。方法應(yīng)該結(jié)束。21結(jié)束線程結(jié)束線程 class xyz implements runnable private boolean timetoquit = false; public void run( )while(!timetoquit) / clean up before run() ends. public void stoprunning( )timetoquit = true ; public class con

13、trolthread public void main(string args)runnable r = new xyz( ) ;thread t = new thread( r) ;t.start();r.stoprunning( ); 22獲取當(dāng)前線程獲取當(dāng)前線程thread 類的靜態(tài)方法類的靜態(tài)方法currentthread( )返回當(dāng)前線程。返回當(dāng)前線程。23測(cè)試線程測(cè)試線程 當(dāng)線程的狀態(tài)未知時(shí),用當(dāng)線程的狀態(tài)未知時(shí),用isalive( )確定線程是)確定線程是否活著。返回否活著。返回true 意味著線程已經(jīng)啟動(dòng),但還沒(méi)有意味著線程已經(jīng)啟動(dòng),但還沒(méi)有運(yùn)行結(jié)束。運(yùn)行結(jié)束。24sleep(

14、 )方法方法該方法用來(lái)使一個(gè)線程暫停運(yùn)行一段固定的時(shí)間。該方法用來(lái)使一個(gè)線程暫停運(yùn)行一段固定的時(shí)間。在線程睡眠時(shí)間內(nèi),將運(yùn)行別的線程。在線程睡眠時(shí)間內(nèi),將運(yùn)行別的線程。 sleep( ) 結(jié)束后,線程將進(jìn)入結(jié)束后,線程將進(jìn)入runnable狀態(tài)。狀態(tài)。25join( ) 方法方法t.join( )方法使當(dāng)前的線程等待,直到方法使當(dāng)前的線程等待,直到 t 結(jié)束為止,線程結(jié)束為止,線程恢復(fù)到恢復(fù)到runnable狀態(tài)。狀態(tài)。public void dotask() timerthread tt= new timerthread(100) ; tt.start( ) ; / do stuff in

15、parallel with the other thread for a while / wait here for the timer thread to finish try tt.join( ); catch( interruptedexception e) / tt came back early / continue in this thread 26yield( )方法方法調(diào)用該方法將調(diào)用該方法將cpu讓給具有與當(dāng)前線程相同優(yōu)先級(jí)讓給具有與當(dāng)前線程相同優(yōu)先級(jí)的線程。的線程。如果沒(méi)有同等優(yōu)先級(jí)的線程是如果沒(méi)有同等優(yōu)先級(jí)的線程是runnable狀態(tài),狀態(tài),yield( )方法將什么也不

16、做。方法將什么也不做。27線程同步線程同步線程間同步機(jī)制線程間同步機(jī)制線程間的交互線程間的交互wait( ) 和和notify( )不建議使用的一些方法不建議使用的一些方法28多線程并發(fā)執(zhí)行中的問(wèn)題多線程并發(fā)執(zhí)行中的問(wèn)題多個(gè)線程相對(duì)執(zhí)行的順序是不確定的。多個(gè)線程相對(duì)執(zhí)行的順序是不確定的。線程執(zhí)行順序的不確定性會(huì)產(chǎn)生執(zhí)行結(jié)果的不確定性。線程執(zhí)行順序的不確定性會(huì)產(chǎn)生執(zhí)行結(jié)果的不確定性。在多線程對(duì)共享數(shù)據(jù)在多線程對(duì)共享數(shù)據(jù) 操作時(shí)常常會(huì)產(chǎn)生這種不確定性。操作時(shí)常常會(huì)產(chǎn)生這種不確定性。29多線程并發(fā)執(zhí)行中的問(wèn)題多線程并發(fā)執(zhí)行中的問(wèn)題一個(gè)堆棧類:一個(gè)堆棧類:public class mystack pr

17、ivate int idx = 0 ; private char data = new char6 ; public void push( char c ) dataidx = c ;idx + ; / 棧頂指針指向下一個(gè)空單元棧頂指針指向下一個(gè)空單元 public char pop( )idx- ; return dataidx ;30多線程并發(fā)執(zhí)行中的問(wèn)題多線程并發(fā)執(zhí)行中的問(wèn)題線程線程 a線程線程b堆棧堆棧 s 狀態(tài)狀態(tài)時(shí)刻時(shí)刻t1時(shí)刻時(shí)刻t2時(shí)刻時(shí)刻t3/調(diào)用調(diào)用s.push( );dataidx=r ;/調(diào)用調(diào)用s.pop( )idx- ;return dataidx;/恢復(fù)運(yùn)行恢復(fù)運(yùn)

18、行idx+ ;/*線程線程a 被搶占被搶占idx+; 未執(zhí)行未執(zhí)行*/| p | q | | | | |idx=2| p | q | r | | | |idx=2| p | q | r | | | |idx=1| p | q | r | | | |idx=2.!“q”被兩次壓棧; 線程a 壓入的數(shù)據(jù)“r”丟失。31對(duì)象鎖的概念對(duì)象鎖的概念 java中每個(gè)對(duì)象都帶有一個(gè)中每個(gè)對(duì)象都帶有一個(gè)monitor標(biāo)志,標(biāo)志,相當(dāng)于一個(gè)鎖。相當(dāng)于一個(gè)鎖。 sychronized關(guān)鍵字用來(lái)給對(duì)象加上獨(dú)占的排它鎖。關(guān)鍵字用來(lái)給對(duì)象加上獨(dú)占的排它鎖。32對(duì)象鎖的操作對(duì)象鎖的操作code or behaviorda

19、ta or stateobject thisthread before synchronized(this)public void push(char c) synchronized(this)dataidx = c ;idx+ ;33code or behaviordata or stateobject thisthread after synchronized(this)public void push(char c) synchronized(this)dataidx = c ;idx+ ;對(duì)象鎖的操作對(duì)象鎖的操作34示例示例將將mystack 對(duì)棧的對(duì)棧的push,pop操作都采用這種

20、機(jī)制:操作都采用這種機(jī)制:public class mystack public void push( char c ) synchronized(this) dataidx = c ; idx + ; public char pop( ) synchronized(this)idx- ; return dataidx ;35線程線程 a線程線程b堆棧堆棧 s 狀態(tài)狀態(tài)時(shí)刻時(shí)刻t1時(shí)刻時(shí)刻t2時(shí)刻時(shí)刻t3/*調(diào)調(diào) 用用s.push( ), 獲得獲得s的的monitor后運(yùn)行后運(yùn)行*/dataidx=r ;/*調(diào)用調(diào)用s.pop(),未獲得未獲得s的的monitor,b到到s的的lock poo

21、l中等待中等待*/恢復(fù)運(yùn)行恢復(fù)運(yùn)行idx+ ;。/*完成,并交回完成,并交回s的的monitor*/線程線程a 被搶占被搶占| p | q | r | | | |idx=2| p | q | r | | | |idx=2| p | q | r | | | |idx=3.多線程對(duì)共享數(shù)據(jù)進(jìn)行操作多線程對(duì)共享數(shù)據(jù)進(jìn)行操作時(shí)刻時(shí)刻t4/運(yùn)行運(yùn)行pop得結(jié)果得結(jié)果r| p | q | r | | | |idx=236 幾點(diǎn)說(shuō)明幾點(diǎn)說(shuō)明如何返還對(duì)象的如何返還對(duì)象的monitor當(dāng)當(dāng)synchronized( ) 語(yǔ)句塊執(zhí)行完畢后。語(yǔ)句塊執(zhí)行完畢后。當(dāng)在當(dāng)在synchronized( ) 語(yǔ)句塊中出現(xiàn)語(yǔ)句

22、塊中出現(xiàn)exception.當(dāng)調(diào)用該對(duì)象的當(dāng)調(diào)用該對(duì)象的wait( )方法。將該線程放入方法。將該線程放入 對(duì)象的對(duì)象的wait pool中,等待某事件的發(fā)生。中,等待某事件的發(fā)生。37 幾點(diǎn)說(shuō)明幾點(diǎn)說(shuō)明對(duì)共享數(shù)據(jù)的所有訪問(wèn)都必須使用對(duì)共享數(shù)據(jù)的所有訪問(wèn)都必須使用synchronized.用用synchronized保護(hù)的共享數(shù)據(jù)必須是私有的,使線程保護(hù)的共享數(shù)據(jù)必須是私有的,使線程不能直接訪問(wèn)這些數(shù)據(jù),必須通過(guò)對(duì)象的方法。不能直接訪問(wèn)這些數(shù)據(jù),必須通過(guò)對(duì)象的方法。如果一個(gè)方法的整體都在如果一個(gè)方法的整體都在synchronized塊中,則可以把塊中,則可以把synchronized關(guān)鍵字放于

23、方法定義的頭部:關(guān)鍵字放于方法定義的頭部:public synchronized void push( char c)38 幾點(diǎn)說(shuō)明幾點(diǎn)說(shuō)明public class reentrant public class reentrant public synchronized void a() public synchronized void a() b(); b(); system.out.println(here i am, in a(); system.out.println(here i am, in a(); public synchronized void b() public sync

24、hronized void b() system.out.println(here i am, in b(); system.out.println(here i am, in b(); java運(yùn)行系統(tǒng)允許已經(jīng)擁有某個(gè)對(duì)象所的線程再次獲得該運(yùn)行系統(tǒng)允許已經(jīng)擁有某個(gè)對(duì)象所的線程再次獲得該對(duì)象的鎖對(duì)象的鎖java locks are reentrant. 39避免死鎖避免死鎖死鎖是指兩個(gè)線程同時(shí)等待對(duì)方持有的鎖。死鎖是指兩個(gè)線程同時(shí)等待對(duì)方持有的鎖。死鎖的避免完全由程序控制。死鎖的避免完全由程序控制。可以采用的方法:可以采用的方法: 如果要訪問(wèn)多個(gè)共享數(shù)據(jù)對(duì)象,則要從全局考慮定義如果要訪問(wèn)多個(gè)共

25、享數(shù)據(jù)對(duì)象,則要從全局考慮定義一個(gè)獲得封鎖的順序,并在整個(gè)程序中都遵守這個(gè)一個(gè)獲得封鎖的順序,并在整個(gè)程序中都遵守這個(gè)順序。釋放鎖時(shí),要按加鎖的反序釋放。順序。釋放鎖時(shí),要按加鎖的反序釋放。40線程間的交互線程間的交互 wait( ) 和和notify( ) 線程在線程在synchronized塊中調(diào)用塊中調(diào)用x.wait( )等待共享數(shù)據(jù)等待共享數(shù)據(jù)的某種狀態(tài)。該線程將放入對(duì)象的某種狀態(tài)。該線程將放入對(duì)象x的的wait pool, 并且將釋并且將釋放放x的的monitor。 線程在改變共享數(shù)據(jù)的狀態(tài)后,調(diào)用線程在改變共享數(shù)據(jù)的狀態(tài)后,調(diào)用x.notify(),則對(duì)象,則對(duì)象的的wait po

26、ol中的一個(gè)線程將移入中的一個(gè)線程將移入lock pool,等待,等待x的的monitor,一旦獲得便可以運(yùn)行。一旦獲得便可以運(yùn)行。 notifyall( )把對(duì)象把對(duì)象wait pool中的所有線程都移入中的所有線程都移入lock pool。41示例示例-producer/consumerproducer線程:每隔線程:每隔300ms產(chǎn)生一個(gè)字母壓棧產(chǎn)生一個(gè)字母壓棧thestack ,共共200個(gè)。個(gè)。public void run( ) char c ; for(int i=0; i200; i+)c=(char)(math.random()*26+a); thestack.push( c

27、);trythread.sleep(300) ;catch(interruptedexception e) 42示例示例-producer/consumerconsumer線程:從棧線程:從棧thestack中取中取200個(gè)字符,間隔個(gè)字符,間隔300ms。public void run( ) char c ; for(int i=0; i200; i+)c = thestack.pop( );try thread.sleep(300) ;catch(interruptedexception e) 43示例示例-producer/consumer堆棧類堆棧類syncstack:為了保證共享數(shù)據(jù)

28、一致性,為了保證共享數(shù)據(jù)一致性,push( ) 與與pop( ) 定義成定義成synchronized;為了實(shí)現(xiàn)為了實(shí)現(xiàn)producer 與與 consumer之間的同步,加入之間的同步,加入wait( ) 與與notify( )public class syncstackprivate vector buffer = new vector(400,200) ;public synchronized char pop( ) ;public synchronized void push(char c) 44示例示例-producer/consumerpop( )方法:方法:public sync

29、hronized char pop( ) char c ; while(buffer.size( ) =0) trythis.wait( );catch(interruptedexception e) c=( (character)buffer.remover(buffer.size( )-1).charvalue(); return c ;45示例示例-producer/consumerpush( )方法方法:public synchronized void push(char c) this.notify( ); character charobj = new character( c )

30、; buffer.addelement( char obj); 46不建議使用的方法不建議使用的方法 stop( )線程強(qiáng)行終止,容易造成數(shù)據(jù)的不一致。線程強(qiáng)行終止,容易造成數(shù)據(jù)的不一致。 suspend( ) 和和 resume( )使一個(gè)線程使一個(gè)線程a可以通過(guò)調(diào)用可以通過(guò)調(diào)用b.suspend( )直接控制直接控制b的運(yùn)行。的運(yùn)行。suspend( )方法將不使方法將不使b釋放鎖。容易發(fā)生死鎖。建議使用釋放鎖。容易發(fā)生死鎖。建議使用wait( )和和notify( ).47線程狀態(tài)與生命周期線程狀態(tài)與生命周期runnablerunningotherwiseblockeddeadblock

31、ed in objcetslock poolblocked inobjects wait poolnewstart( )scheduleryield( )sleep() or join( )run( ) endswait( )synchronized( )lock avaleblenotify( )interrupt( )sleep( ) timeoutthread joins orinterrupt48線程狀態(tài)線程狀態(tài)幾種基本狀態(tài)幾種基本狀態(tài)new, runnable, running, dead, blocked等。等。線程狀態(tài)由線程控制方法,如線程狀態(tài)由線程控制方法,如sleep( ), join()或線程同步或線程同步控制方法引起變化??刂品椒ㄒ鹱兓?。49線程分組(線程分組(groupi

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論