




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、生產(chǎn)者消費者生產(chǎn)者-消費者(producer-consumer)問題,也 稱作有界緩沖區(qū)(bounded-buffer)問題,兩個 進程共享一個公共的固定大小的緩沖區(qū)。其中一 個是生產(chǎn)者,用于將消息放入緩沖區(qū);另外一個 是消費者,用于從緩沖區(qū)中取出消息。問題出現(xiàn) 在當(dāng)緩沖區(qū)已經(jīng)滿了,而此時生產(chǎn)者還想向其中 放入一個新的數(shù)據(jù)項的情形,其解決方法是讓生 產(chǎn)者此時進行休眠,等待消費者從緩沖區(qū)中取走 了一個或者多個數(shù)據(jù)后再去喚醒它。同樣地,當(dāng) 緩沖區(qū)已經(jīng)空了,而消費者還想去取消息,此時 也可以讓消費者進行休眠,等待生產(chǎn)者放入一個 或者多個數(shù)據(jù)時再喚醒它。聽起來好像蠻對的,無懈可擊似的,但其實在實 現(xiàn)時
2、會有一個競爭條件存在的。為了跟蹤緩沖區(qū) 中的消息數(shù)目,需要一個變量counto如果緩沖 區(qū)最多存放N個消息,則生產(chǎn)者的代碼會首先 檢查count是否達到N,如果是,則生產(chǎn)者休 眠;否則,生產(chǎn)者向緩沖區(qū)中放入一個消息,并 增加count的值。消費者的代碼也與此類似,首先檢測count是否為0,如果是,則休眠;否則,從緩沖區(qū)中取 出消息并遞減count的值。同時,每個進程也 需要檢查是否需要喚醒另一個進程。代碼可能如 下:/跟蹤緩沖/緩沖/緩沖區(qū)大小 ttdefine N 100 int count = 0; 區(qū)的記錄數(shù) /*生產(chǎn)者進程*/ void procedure(void) (int it
3、em; 區(qū)中的數(shù)據(jù)項while(true)/ 無限循環(huán)( item = produce_item(); /產(chǎn)生下一個數(shù)據(jù)項if (count = N)/如果緩沖區(qū)滿了,進行休眠(sleep ();)insert_item(item);/將新數(shù)據(jù)項放入緩沖區(qū)count = count +1;/計數(shù)器加1if (count =1)/表明插入之前為空,(/消費者等待wakeup(consumer);/喚醒消費者)/*消費者進程*/void consumer(void)int item;/ 緩沖區(qū)中的數(shù)據(jù)項while(true)/ 無限循環(huán)(if (count =0)/如果緩沖區(qū)為空,進入休眠( sl
4、eep ();item = remove_item(); /從緩沖區(qū)中取出一個數(shù)據(jù)項count = count -1;/計數(shù)器減1if (count = N -1) /緩沖區(qū)有空槽( /喚醒生產(chǎn)者wakeup(producer);consume_item (item);/打印出數(shù)據(jù)項 看上去很美,哪里出了問題,這里對count的 訪問是有可能出現(xiàn)競爭條件的:緩沖區(qū)為空,消 費者剛剛讀取count的值為0,而此時調(diào)度程 序決定暫停消費者并啟動執(zhí)行生產(chǎn)者。生產(chǎn)者向 緩沖區(qū)中加入一個數(shù)據(jù)項,count加lo現(xiàn)在 count的值變成了 1.它推斷剛才count為0, 所以此時消費者一定在休眠,于是生產(chǎn)
5、者開始調(diào) 用wakeup (consumer)來喚醒消費者。但是,此 時消費者在邏輯上并沒有休眠,所以wakeup信 號就丟失了。當(dāng)消費者下次運行時,它將測試先 前讀到的count值,發(fā)現(xiàn)為0 (注意,其實這個時刻count已經(jīng)為1 了),于是開始休眠(邏 輯上)。而生產(chǎn)者下次運行的時候,count會繼 會填滿緩沖區(qū)的,然后生產(chǎn)者也休眠,這樣兩個 進程就都永遠的休眠下去了。續(xù)遞增,并且不會喚醒consumer了,所以遲早b使用信號量解決生產(chǎn)者-消費者問題首先了解一下信號量吧,信號量是E. W. Dijkstra在1965年提出的一種方法,它 是使用一個整型變量來累計喚醒的次數(shù),供以后 使用。在
6、他的建議中,引入了一個新的變量類型, 稱為信號量(semaphore), 一個信號量的取值可 以為0 (表示沒有保存下來的喚醒操作)或者為 正值(表示有一個或多個喚醒操作)。并且設(shè)立了兩種操作:down和up (分別為一般 化后的sleep和wakeup,其實也是一般教科書 上說的P/V向量)。對一個信號量執(zhí)行down操 作,表示檢查其值是否大于0,如果該值大于0, 則將其值減1 (即用掉一個保存的喚醒信號)并 繼續(xù);如果為0,則進程休眠,而且此時down操 作并未結(jié)束。另外,就是檢查數(shù)值,修改變量值 以及可能發(fā)生的休眠操作都作為單一的,不可分 割的原子操作來完成。下面開始考慮用信號量來解決生
7、產(chǎn)者-消費者問 題了,不過在此之前,再次分析一下這個問題的本質(zhì)會更清晰點:問題的實質(zhì)在于發(fā)給一個(尚) 未休眠進程(如上的消費者進程在只判斷了 count二二0后即被調(diào)度出來,還未休眠)的 wakeup信號丟失(如上的生產(chǎn)者進程在判斷了 count = 1后以為消費者進程休眠,而喚醒它)To如果它沒有丟失,則一切都會很好。100/SdefineN/緩沖區(qū)中的槽數(shù)目 typedef int semaphore;信號量一般被定義為特殊的整型數(shù)據(jù)semaphore mutex = 1; 制對臨界區(qū)的訪問 semaphore empty = N; 數(shù)緩沖區(qū)中的空槽數(shù)目 semaphore full/控
8、/計二 0;/計數(shù)緩沖區(qū)中的滿槽數(shù)目 /*生產(chǎn)者進程*/void proceducer(void)int item;while (1)item = procedure_item();/生成數(shù)據(jù)down(&empty);/將空槽數(shù)目減down(ftmutex);/進入臨界區(qū)insert_item(item);/將新數(shù)據(jù)放入緩沖區(qū)up(ftmutex);/離開臨界區(qū)up(ftfull);/將滿槽的數(shù)目加1/*消費者進程*/ void consumer(voi)int item;while (1)down (&full);/將滿槽數(shù)目減down(&mutex);/進入臨界區(qū)i
9、tem = remove_item();/從緩沖區(qū)中取出數(shù)據(jù)項up(ftmutex);/離開臨界區(qū)up (ftempty);/將空槽數(shù)目加1consumer_i t em (i t em);/處理數(shù)據(jù)項該解決方案使用了三個信號量:一個為full, 用來記錄充滿的緩沖槽的數(shù)目,一個為empty, 記錄空的緩沖槽總數(shù),一個為mutex,用來確保 生產(chǎn)者和消費者不會同時訪問緩沖區(qū)。mutex的初始值為1,供兩個或者多個進程使用的信號1=1用I,保證同一個時刻只有一個進程可以進入臨界區(qū),稱為二元信號量(binary semaphore)o如 果每一個進程在進入臨界區(qū)前都執(zhí)行一個 down(.),在剛剛
10、退出臨界區(qū)時執(zhí)行一個 up(.),就能夠?qū)崿F(xiàn)互斥。另外,通常是將down和up操作作為系統(tǒng)調(diào)用 來實現(xiàn),而且OS只需要在執(zhí)行以下操作時暫時 禁止全部中斷:測試信號量,更新信號量以及在 需要時使某個進程休眠。這里使用了三個信號量,但是它們的目的卻不相 同,其中 full和 empty用來同步 (synchronization),而 mutex 用來實現(xiàn)互斥。2,使用消息傳遞解決生產(chǎn)者-消費者問題這種IPC方式使用兩條原語send和 receive,也是系統(tǒng)調(diào)用。如:send(dest, &msg)/將消息msg發(fā)送到目標(biāo)(進程)dest中receive (src, &msg) /
11、 接收由 src 過 來的msg,如果沒有消息可用,則可能阻塞接收 者 消息傳遞系統(tǒng)會面臨位于網(wǎng)絡(luò)中不同機器上的 通信進程的情形,所以會更加的復(fù)雜。如:消息 可能被網(wǎng)絡(luò)丟失,一般使用確認(ACK)消息。如果發(fā)送方在一定的時間段內(nèi)沒有收到確認消 息,則重發(fā)消息。如果消息本身被正確接收,但是返回的ACK消 息丟失,發(fā)送方則重發(fā)消息,這樣接收方就會收 到兩份同樣的消息。一般使用在每條原始消息的 頭部嵌入一個連續(xù)的序號來解決這個問題。另外,消息傳遞系統(tǒng)還需要解決進程命名的問 題,在send和receive系統(tǒng)調(diào)用中指定的進 程必須沒有二義性的。還有其他的一些問題,如 性能問題,身份認證等等,不過那個就
12、會扯多了, 還是看看如果解決這個生產(chǎn)者-消費者的問題 吧:ttdefineN/緩沖區(qū)中的槽數(shù)目100/*生產(chǎn)者進程*/ void proceducer(void) (int item;msg;message/消息緩沖區(qū)while (1)item = proc edur e_item ();/生成數(shù)據(jù)receive(consumer, &msg);/等待消費者發(fā)送空的緩沖區(qū)build_msg(&msg,item);/創(chuàng)建待發(fā)送消息send (consumer,&msg);/發(fā)送數(shù)據(jù)項給消費者/*消費者進程*/ void consumer(voi) (int item, i
13、;message msg;&msg);for (i=0; i<N; i+) send(producer, /發(fā)送給生產(chǎn)者N個空緩沖區(qū)while(l)receive (producer,&msg);/接收包含數(shù)據(jù)項的消息item = extract_item(&msg);/解析消息,并組裝成數(shù)據(jù)項send (proceduer, &msg);/然后又將空緩沖區(qū)發(fā)送回生產(chǎn)者consumer_item(item);/處理數(shù)據(jù)項在這個解決方案中,共使用了 N條消息,有點類似于上一個的共享內(nèi)存緩沖區(qū)的N個槽,消 費者進程這邊首先通過一個for循環(huán)將N條空 消息發(fā)送給
14、生產(chǎn)者。當(dāng)生產(chǎn)者向消費者傳遞一個 數(shù)據(jù)項時,是通過取走每一條接收到的空消息, 然后送回填充了內(nèi)容的消息給消費者的。通過這 種方式,整個消息傳遞系統(tǒng)中的總的消息數(shù)(包 括空的消息+存了數(shù)據(jù)項的消息=N)是不變 的。如果運行過程中,生產(chǎn)者進程的速度比消費者 快,則所有的消息最終都會塞滿,然后生產(chǎn)者進 程就會等待消費者(即使調(diào)用procedure也是 阻塞在receive處),直到消費者返回一條空的 消息;反之亦然。F面再來看一下消息傳遞方式的兩種變體。一種是:為每一個進程分配一個唯一的地址,讓消息 按照這個進程的地址進行編址。也就是send和receive調(diào)用的第一個參數(shù)指定為具體的進程 地址。另
15、一種是:引入信箱(mailbox,現(xiàn)在正 在做的一個項目,就是這種方式),可以信箱就 像一個盒子,里面裝了很多的信件,這個信件就 是我們要傳遞的消息,當(dāng)然信箱是有容量限制的(現(xiàn)在yahoo好像推出無限容量的,呵呵)。當(dāng) 使用信箱時,send和receive系統(tǒng)調(diào)用中的地 址參數(shù)就是信箱的地址,而不是進程的地址。當(dāng) 一個進程嘗試向一個容量爆滿的信箱發(fā)送消息 時,它將會被掛起,直到信箱中有消息被取走。多線程一,線程的一些基本知識。進程與線程所有的操作系統(tǒng)都支持同時運行多個任務(wù),一 個任務(wù)通常就是一個程序,每個運行中就是一個 進程,當(dāng)一個程序運行時,內(nèi)部可能包含了多個 順序執(zhí)行流,每個順序執(zhí)行流就是
16、一個線程。進程(process)當(dāng)一個程序進入內(nèi)存運行即變成一個進程,進 程處于運行過程中的程序,并且具有一定的獨立 功能,進程是系統(tǒng)進行資源分配和調(diào)用的獨立單 位,進程切換開銷大。多進程在操作系統(tǒng)中,能同時運行多個任務(wù)程序。進程包含三大特征1,獨立性:進程是系統(tǒng)中獨立存在的實體,它可以擁有自 己獨立的資源,每一個進程都擁有自己私有的地 址空間,沒有經(jīng)過進程本身允許的情況下,一個 用戶不可以直接訪問其他進程的地址空間。2,動態(tài)性:進程與程序的區(qū)別在于程序只是個靜態(tài)的指定 集合,而進程是一個正在系統(tǒng)中活動的指定集 合,在進程中加入了時間的概念,進程具有自己 的生命周期和各種不同的狀態(tài),這些狀態(tài)在
17、程序 中是不具備的。3,并發(fā)性:多個線程可以在單個處理器是并發(fā)執(zhí)行多個進程,進程之間,不會互相影響。注:對于一個CPU而言,它在某個時間點上只能執(zhí) 行一個程序,就是說只能運行一個進程。CPU不 斷在這些進程之間輪回切換,CPU的執(zhí)行速度相 對于我們的感覺太快,我們感覺不到,所以CPU 在多個進程之間輪回執(zhí)行,但我們?nèi)祟惛杏X好像 多個進程同時執(zhí)行。線程(Thread)線程被稱為輕量級的進程,線程是進程的執(zhí)行 單元,就像進程在操作系統(tǒng)中的地位一樣。線程 在程序中是獨立的,并發(fā)的執(zhí)行的流。當(dāng)進程被 初始化后,主線程就被創(chuàng)建了,一般的應(yīng)用程序 來說,通常僅要求有一個主線程,但我們也可以 在該進程內(nèi)創(chuàng)建
18、多條順序執(zhí)行流,這些順序執(zhí)行 流就是線程,每條線程是相互獨立的。注:總而言之,一個程序運行后,至少有一個進程, 一個進程里可以包含多個線程,但至少要包含一個線程。多線程(multithreading)在同一個應(yīng)用程序中,有多個順序執(zhí)行流同時 執(zhí)行。線程比進程具有更高的性能,這是由于同一個 進程中的線程都有共性,多個線程將共享同一個 進程的虛擬空間,-線程共享的環(huán)境包括進程代 碼段,進程的公有數(shù)據(jù)等,利用這些共享的數(shù)據(jù), 線程很容易實現(xiàn)相互之間的通信。當(dāng)操作系統(tǒng)創(chuàng)建一個進程時,該進程必須分配 獨立的內(nèi)存空間,分配大量相關(guān)資料,但創(chuàng)建一 個線程簡單的多,因此使用多線程來實現(xiàn)并發(fā)比 使用多進程來實現(xiàn)
19、并發(fā)的性能要高得多。多線程的優(yōu)點1,進程之間不能共享內(nèi)存,但線程之間共享內(nèi)存非常容易。2,系統(tǒng)創(chuàng)建進程需要為該進程重新分配系統(tǒng)資源,但創(chuàng)建線程代價要小的多,因此使用多線程來實現(xiàn)多個任務(wù)并發(fā)比多進程要效率高。3, Java語言中內(nèi)置多線程功能的支持,而不是單純的作為底層的操作系統(tǒng)的調(diào)動方式,從而 簡化了 Java的多線程編程。二,線程的啟動和創(chuàng)建Thread 類(Java. lang. Thread 類)在Java語言中Thread類代表線程,所有的線 程對象都必須是Thread類或其子類的實例。每 條線程的作用是完成一定的任務(wù),實際上就是執(zhí)行一段程序流,也叫一段順序執(zhí)行的代碼,Java使用ru
20、n方法來封裝這樣一段程序流。繼承Thread類創(chuàng)建和啟動線程1,定義Thread類的子類,并重寫該類的run 方法,該run方法的方法體就是代表了線程需要 完成的任務(wù),run方法也被稱為線程執(zhí)行體。2,創(chuàng)建Thread類子類的實例,即創(chuàng)建了線程的對象。3,用線程對象的start方法來啟動該線程。start ()方法使該線程開始執(zhí)行,Java虛擬機調(diào)用該線程的 run方法。getName ()方法返回該線程的名稱setName (String name)方法修改該線程的名稱interrupt ();中斷線程sleep(long millis);在指定的毫秒內(nèi)讓當(dāng)前正在執(zhí)行的線程休眠.1,實現(xiàn)Ru
21、nable接口的實現(xiàn)類,并重寫該接口 的run方法,該run方法的方法體同樣是該線程 的執(zhí)行體。2,創(chuàng)建Runable實現(xiàn)類的實例,并以此實例作為Thread類的目標(biāo)來創(chuàng)建Thread類的目標(biāo)創(chuàng)建Thread對象,該Thread對象才是真正的線程對 象。Thread類和Runable接口創(chuàng)建線程的對比 繼承Thread類方式的多線程的優(yōu)點: 編寫簡單,如果訪問當(dāng)前線程,無需使用Thread. currentThread 方法,直接使用 this,即可獲得當(dāng)前線程。繼承Thread類方式的多線程缺點:因為線程已經(jīng)繼承了 Thread類,所以不能再繼 承其他的類。實現(xiàn)Runable接口的優(yōu)點:線程
22、只是實現(xiàn)了 Runable接口,還可以繼承其他的類,在這種方式下,可以多個線程共享同一 個目標(biāo)(target)對象,所以非常適合多個線程來 處理同一份資源的情況,從而可以將CPU代碼和 數(shù)據(jù)分開,形成清晰的模型,體現(xiàn)了面向?qū)ο蟮?思想。實現(xiàn)Runable接口的缺點:編程稍微復(fù)雜,如果需要訪問當(dāng)前線程,必須 使用 Thread. currentThread 方法。三,線程的生命周期當(dāng)線程被創(chuàng)建并啟動以后,它既不是一啟動就 進入了執(zhí)行的狀態(tài),也不是一直處于執(zhí)行狀態(tài), 在線程的生命周期里,它要經(jīng)過新建,就緒,運 行,阻塞,死亡五種狀態(tài)。尤其是當(dāng)線程啟動以后,它不能一直霸占著CPU獨立運行,所以CPU
23、 多條線程之間切換,于是線程狀態(tài)也會多次在運 行和阻塞之間切換。新建或就緒狀態(tài)啟動線程使用start方法,而不是run方法, 永遠不用調(diào)用線程對象的run方法,調(diào)用start 方法來啟動線程系統(tǒng)會把該run方法當(dāng)成線程 執(zhí)行體來處理。但如果直接調(diào)用線程對象的run 方法,則run方法立即會被執(zhí)行,而且在run方法返回之前其他線程無法并發(fā)執(zhí)行,也就是說系 也是一個普通方法,而不是線程執(zhí)行體。統(tǒng)吧線程對象當(dāng)成一個普通的對象,而run方法當(dāng)線程對象調(diào)用了 start方法之后,該線程處 于就緒狀態(tài),JVM會為創(chuàng)建方法調(diào)用棧和線程計 數(shù)器處于這個狀態(tài)中的線程,并沒有開始運行, 它只是表示該線程可以運行了
24、,至于該線程何時 開始運行,取決于JVM里線程調(diào)度器的調(diào)度。運行和阻塞狀態(tài)如果處于就緒狀態(tài)的線程獲得了 CPU資源,開始執(zhí)行run方法的執(zhí)行體,則該線程處于運行狀 態(tài),當(dāng)一條線程開始運行后,它不可能一直處于 運行狀態(tài),線程在運行的過程中,需要被中斷, 目的是使其他線程獲得執(zhí)行的機會,當(dāng)發(fā)生以下 情況下,線程將會進入阻塞狀態(tài);1,線程調(diào)用sleep方法主動放棄所占有的CPU 資源。2,線程調(diào)用一個阻塞式10方法,該方法返回之前該線程被阻塞。3,線程試圖獲得一個同步監(jiān)視器,但該同步監(jiān)視器正被其他線程所占據(jù)。4,線程在等待某個通知(ntify, ntifyAll方法 在Objiet類里)。5,程序調(diào)
25、用了線程的suspend方法,將線程掛 起暫停),不過這個方法容易導(dǎo)致死鎖,所以程 序盡量避免該方法。線程重新進入就緒狀態(tài)有以下情況:b調(diào)用sleep方法的線程經(jīng)過指定的時間。2,線程調(diào)用阻塞式10方法已經(jīng)返回。3,線程成功的獲得了試圖取得同步監(jiān)視器o4,線程正在等待某個通知,其他線程發(fā)出了通知。5,處于掛起狀態(tài)的線程被調(diào)用了 resume方法 恢復(fù)。注:阻塞狀態(tài)也叫不可運行狀態(tài)調(diào)用yield方法可以讓當(dāng)前運行的線程轉(zhuǎn)入就 緒狀態(tài)。線程會在以下三種方式之一結(jié)束線程,處于死 亡狀態(tài):1, run方法執(zhí)行完成,線程正常結(jié)束。2,線程拋出一個未捕獲的Exception或Erroro3,直接調(diào)用線程的
26、stop方法來結(jié)束該線程, 該方法容易導(dǎo)致死鎖,通常不推薦用。isAlive 方法測試某條線程是否已經(jīng)死亡,當(dāng)線程處于就緒, 運行,阻塞三種狀態(tài)時,該方法返回true,當(dāng) 該線程處于創(chuàng)建,死亡兩種狀態(tài)時,該方法返回false。注:不要試圖對一個已經(jīng)死亡的線程調(diào)用start方 法,使它重新啟動,該線程將不可再次作為線程 執(zhí)行,它會拋出 IllegaThreadStateException 異常。不要讓處于死亡狀態(tài)的線程調(diào)用start方法, 程序只能對新建狀態(tài)的線程調(diào)用start方法,對 新建狀態(tài)的線程兩次調(diào)用start方法也是錯誤 的。join()方法等待被join的線程執(zhí)行完成。join (l
27、ong millis)方法等join的新車的時間最長為minllis毫秒,如 果在nd 11 i s毫秒內(nèi)被join的線程還沒有執(zhí)行結(jié) 束,則不再等待。join (long millis , int nanos)方法等待被join的時機最長為millis毫秒加nanos 納秒。setPriority ()和方法:來設(shè)值和取值,返回線程的優(yōu)先級,其中setPriority可以是 個整數(shù),范圍是一到十之間,也可以是MAX_PRIORITY , MIN_PRIORITY , N0RM_PRI0RITY三個靜態(tài)常量。getPriority ()方法返回線程的優(yōu)先級。每個線程執(zhí)行時,都具有 一定的優(yōu)先級
28、,優(yōu)先級高的線程獲得較多的執(zhí)行 機會,而優(yōu)先級低的線程則獲得較小的執(zhí)行機 會。后臺線程(DaemonThread)有一種線程它是在后臺運行的,它的任務(wù)是為 其他線程提供服務(wù),這種線程稱為后臺線程,又 稱為守護線程,又稱為精靈線程。JVM的垃圾回 收線程就是典型的后臺線程。后臺線程有個特 征:如果所有的前臺線程都死亡,后臺線程會自 動死亡。調(diào)用Thread對象的setDaemon(blooeanon)方法(參數(shù)傳true),可將指定線程設(shè)置為后臺線程,isDaemonO判斷該線程是否為后臺線 程,如果該線程是守護線程,則返回true;否 則返回falseosleep (long mi 11 is
29、)方法(線程睡眠)讓當(dāng)前正在執(zhí)行的線程暫停并進入阻塞狀態(tài), 該方法受到系統(tǒng)計時器和線程調(diào)度器的精度和 準(zhǔn)確度的影響。注:當(dāng)前線程調(diào)用sleep方法,進入阻塞狀態(tài)后, 在sleep時間段內(nèi),該線程不會獲得執(zhí)行的機 會,即使系統(tǒng)中沒有其他可運行的線程,處于sleep時間段里的線程也不會運行。因此sleep 常用來暫停程序的執(zhí)行,yield。方法(線程讓步)yield方法和sleep有點相似的方法,讓當(dāng)前 正在執(zhí)行的線程暫停,但它不會阻塞該線程,它 只是將該線程轉(zhuǎn)入就緒狀態(tài),yield方法只是讓 當(dāng)前線程暫停一下,讓系統(tǒng)的線程調(diào)度器從新調(diào) 度一次,當(dāng)某個線程調(diào)用了 yield方法暫停之 后,只有優(yōu)先
30、級與當(dāng)前線程相同,或者優(yōu)先級比 當(dāng)前線程更高的就緒狀態(tài)的線程才會獲得執(zhí)行的機會sleep方法和yield方法的區(qū)別L sleep方法暫停當(dāng)前線程后,會給其他線程 執(zhí)行機會,不會理會其他線程的優(yōu)先級,但yield 方法只會給優(yōu)先級相同或優(yōu)先級更高的線程執(zhí) 行機會。2, sleep方法會將線程轉(zhuǎn)入阻塞狀態(tài),直到經(jīng) 過阻塞時間,才會轉(zhuǎn)入就緒狀態(tài),而yield方法 不會將線程轉(zhuǎn)入阻塞狀態(tài),它只是強制當(dāng)前線程 進入就緒狀態(tài),因此完全有可能某個線程用yield方法暫停之后立即再次獲得處理器資源被執(zhí)行。3, sleep方法聲明拋出 InterruptedException 異常。所有調(diào)用sleep方法時,要
31、么撲捉該異常, 要么顯示聲明拋出該異常。而yield方法則沒有 聲明拋出任何異常。4, sleep方法比yield方法有更好的可移植性,通常不用依靠yield方法來控制并發(fā)線程的執(zhí) 行。interrupt ()使該線程中斷,如果一個線程拋出異常,可以 用interrupt在catch里中斷該線程.Thread ()分配新的Thread對象。Thread(Runnable target)分配新的Thread對象。Thread(Runnable target, String name) 分配新的Thread對象。Thread (String name)static Thread currentTh
32、read()返回對當(dāng)前正在執(zhí)行的線程對象的引用。String getName ()返回該線程的名稱。void setName(String name)改變線程名稱,使之與參數(shù)name 相同。int getPriority()返回線程的優(yōu)先級。void setPriority(int newPriority)更改線程的優(yōu)先級。void interrupt ()中斷線程。boolean isAlive ()測試線程是否處于活動狀態(tài)。boolean isDaemon ()測試該線程是否為守護線程。void join()等待該線程終止。void join(long millis)等待該線程終止的時間最長為millis 毫秒。void run ()如果該線程是使用獨立的 Runnable運行對象構(gòu)造的,則調(diào)用該Runnable 對象的run方法;否則,該方法不執(zhí)行任何操 作并返回。void setDaemon(boolean on)將該線程標(biāo)記為守護線程或用戶線43Eovoid start ()使該線程開始執(zhí)行;Java虛擬機調(diào) 用該線程的run方法。static void yield()暫停當(dāng)前正在執(zhí)行的線程對象,并 執(zhí)行其他線程。ThreadGroup 類T
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件著作權(quán)在科技創(chuàng)新中的推動作用
- 飲食多樣性與營養(yǎng)支持的實踐
- 初中語文生活美文拉薩的云
- 質(zhì)量保障下的供應(yīng)商篩選標(biāo)準(zhǔn)及實踐
- 浙江鴨2025版高中生物考前特訓(xùn)選擇題快練考點10免疫系統(tǒng)與免疫功能含解析
- 小學(xué)數(shù)學(xué)數(shù)學(xué)故事他們?nèi)绾握J出他的
- 財務(wù)透明度與指標(biāo)提升的相互關(guān)系
- 高效辦公環(huán)境的創(chuàng)建與項目綜合評估實例
- 金融市場的財務(wù)分析與預(yù)測技巧
- 跨國公司如何利用科技創(chuàng)新驅(qū)動業(yè)務(wù)增長
- 《胸外按壓》課件
- 2024屆南通二模(又蘇北七市二模)數(shù)學(xué)試題
- 北師大版六年級下冊書法練習(xí)指導(dǎo)教案教學(xué)設(shè)計
- 江西省南昌市2024屆高三一模語文試題及答案解析
- 2023年小學(xué)音樂2022版新課程標(biāo)準(zhǔn)考試測試題及答案(共五套)
- 第一章村集體經(jīng)濟組織會計制度講解
- 湖北煙草公司招聘考試真題
- 2024年江蘇護理職業(yè)學(xué)院高職單招(英語/數(shù)學(xué)/語文)筆試歷年參考題庫含答案解析
- -藝術(shù)博覽會與藝術(shù)品拍賣
- 保健滋補品行業(yè)報告
- 2024智能燃氣表通用技術(shù)要求
評論
0/150
提交評論