多線程與并發(fā)庫高級應(yīng)用三_第1頁
多線程與并發(fā)庫高級應(yīng)用三_第2頁
多線程與并發(fā)庫高級應(yīng)用三_第3頁
多線程與并發(fā)庫高級應(yīng)用三_第4頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、技術(shù)總結(jié)多線程與并發(fā)庫高級應(yīng)用(三)- HYPERLINK / t _blank android培訓(xùn)、 HYPERLINK / t _blank java培訓(xùn)、期待與您交流! -13.java5條件阻塞Condition的應(yīng)用Condition的功能類似在傳統(tǒng)線程技術(shù)中的Object.wait()和Object.natify()的功能,傳統(tǒng)線程技術(shù)實現(xiàn)的互斥只能一個線程單獨干,不能說這個線程干完了通知另一個線程來干,Condition就是解決這個問題的,實現(xiàn)線程間的通信。比如CPU讓小弟做事,小弟說我先歇著并通知大哥,大哥就開始做事。publicinterfaceConditionCondit

2、ion將Object監(jiān)視器方法(wait、notify和notifyAll)分解成截然不同的對象,以便通過將這些對象與任意Lock實現(xiàn)組合使用,為每個對象提供多個等待set(wait-set)。其中,Lock替代了synchronized方法和語句的使用,Condition替代了Object監(jiān)視器方法的使用。Condition實例實質(zhì)上被綁定到一個鎖上。要為特定Lock實例獲得Condition實例,請使用其newCondition()方法。作為一個示例,假定有一個綁定的緩沖區(qū),它支持put和take方法。如果試圖在空的緩沖區(qū)上執(zhí)行take操作,則在某一個項變得可用之前,線程將一直阻塞;如果試

3、圖在滿的緩沖區(qū)上執(zhí)行put操作,則在有空間變得可用之前,線程將一直阻塞。我們喜歡在單獨的等待set中保存put線程和take線程,這樣就可以在緩沖區(qū)中的項或空間變得可用時利用最佳規(guī)劃,一次只通知一個線程??梢允褂脙蓚€Condition實例來做到這一點。classBoundedBuffer阻塞隊列滿了不能放,空了不能取finalLocklock=newReentrantLock();finalConditionnotFull=lock.newCondition();finalConditionnotEmpty=lock.newCondition();finalObjectitems=newObj

4、ect100;intputptr,takeptr,count;publicvoidput(Objectx)throwsInterruptedExceptionlock.lock();trywhile(count=items.length)notFull.await();itemsputptr=x;if(+putptr=items.length)putptr=0;+count;notEmpty.signal();finallylock.unlock();publicObjecttake()throwsInterruptedExceptionlock.lock();trywhile(count=0

5、)notEmpty.await();Objectx=itemstakeptr;if(+takeptr=items.length)takeptr=0;-count;notFull.signal();returnx;finallylock.unlock();使用方法:Locklock=newReentrantLock();Conditioncondition=lock.newCondition();this.wait()condition.await()this.notify()condition.signal()注意:判斷條件時用while防止虛假喚醒,等待在那里,喚醒后再進(jìn)行判斷,確認(rèn)符合要求

6、后再執(zhí)行任務(wù)。-14.java5的Semaphore同步工具Semaphore可以維護(hù)當(dāng)前訪問自身的線程個數(shù),并且提供了同步機(jī)制。semaphore實現(xiàn)的功能類似于廁所里有5個坑,有10個人要上廁所,同時就只能有5個人占用,當(dāng)5個人中的任何一個讓開后,其中在等待的另外5個人中又有一個可以占用了。java.util.concurrent.Semaphore一個計數(shù)信號量。從概念上講,信號量維護(hù)了一個許可集。如有必要,在許可可用前會阻塞每一個acquire(),然后再獲取該許可。每個release()添加一個許可,從而可能釋放一個正在阻塞的獲取者。但是,不使用實際的許可對象,Semaphore只對

7、可用許可的號碼進(jìn)行計數(shù),并采取相應(yīng)的行動。Semaphore通常用于限制可以訪問某些資源(物理或邏輯的)的線程數(shù)目。例如,下面的類使用信號量控制對內(nèi)容池的訪問:classPoolprivatestaticfinalintMAX_AVAILABLE=100;privatefinalSemaphoreavailable=newSemaphore(MAX_AVAILABLE,true);publicObjectgetItem()throwsInterruptedExceptionavailable.acquire();returngetNextAvailableItem();publicvoidpu

8、tItem(Objectx)if(markAsUnused(x)available.release();/Notaparticularlyefficientdatastructure;justfordemoprotectedObjectitems=.whateverkindsofitemsbeingmanagedprotectedbooleanused=newbooleanMAX_AVAILABLE;protectedsynchronizedObjectgetNextAvailableItem()for(inti=0;iMAX_AVAILABLE;+i)if(!usedi)usedi=true

9、;returnitemsi;returnnull;/notreachedprotectedsynchronizedbooleanmarkAsUnused(Objectitem)for(inti=0;iMAX_AVAILABLE;+i)if(item=itemsi)if(usedi)usedi=false;returntrue;elsereturnfalse;returnfalse;獲得一項前,每個線程必須從信號量獲取許可,從而保證可以使用該項。該線程結(jié)束后,將項返回到池中并將許可返回到該信號量,從而允許其他線程獲取該項。注意,調(diào)用acquire()時無法保持同步鎖,因為這會阻止將項返回到池中。

10、信號量封裝所需的同步,以限制對池的訪問,這同維持該池本身一致性所需的同步是分開的。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Semaphore(int) t _blank Semaphore(intpermits)創(chuàng)建具有給定的許可數(shù)和非公平的公平設(shè)置的Semaphore。 HYPERLINK /qzone/newblog/v5/editor.html l Semaphore(int, boolean) t _blank Semaphore(intpermits,booleanfair)創(chuàng)建具有給定的許可數(shù)和給定的公平設(shè)置的Semapho

11、re。方法摘要void HYPERLINK /qzone/newblog/v5/editor.html l acquire() t _blank acquire()從此信號量獲取一個許可,在提供一個許可前一直將線程阻塞,否則線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷。void HYPERLINK /qzone/newblog/v5/editor.html l acquire(int) t _blank acquire(intpermits)從此信號量獲取給定數(shù)目的許可,在提供這些許可前一直將線程阻塞

12、,或者線程已被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷。void HYPERLINK /qzone/newblog/v5/editor.html l acquireUninterruptibly() t _blank acquireUninterruptibly()從此信號量中獲取許可,在有可用的許可前將其阻塞。void HYPERLINK /qzone/newblog/v5/editor.html l acquireUninterruptibly(int) t _blank acquireUninte

13、rruptibly(intpermits)從此信號量獲取給定數(shù)目的許可,在提供這些許可前一直將線程阻塞。int HYPERLINK /qzone/newblog/v5/editor.html l availablePermits() t _blank availablePermits()返回此信號量中當(dāng)前可用的許可數(shù)。int HYPERLINK /qzone/newblog/v5/editor.html l drainPermits() t _blank drainPermits()獲取并返回立即可用的所有許可。protectedCollection HYPERLINK /qzone/newb

14、log/v5/editor.html l getQueuedThreads() t _blank getQueuedThreads()返回一個collection,包含可能等待獲取的線程。int HYPERLINK /qzone/newblog/v5/editor.html l getQueueLength() t _blank getQueueLength()返回正在等待獲取的線程的估計數(shù)目。boolean HYPERLINK /qzone/newblog/v5/editor.html l hasQueuedThreads() t _blank hasQueuedThreads()查詢是否有

15、線程正在等待獲取。boolean HYPERLINK /qzone/newblog/v5/editor.html l isFair() t _blank isFair()如果此信號量的公平設(shè)置為true,則返回tectedvoid HYPERLINK /qzone/newblog/v5/editor.html l reducePermits(int) t _blank reducePermits(intreduction)根據(jù)指定的縮減量減小可用許可的數(shù)目。void HYPERLINK /qzone/newblog/v5/editor.html l release() t _blank rel

16、ease()釋放一個許可,將其返回給信號量。void HYPERLINK /qzone/newblog/v5/editor.html l release(int) t _blank release(intpermits)釋放給定數(shù)目的許可,將其返回到信號量。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank toString()返回標(biāo)識此信號量的字符串,以及信號量的狀態(tài)。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire() t _blan

17、k tryAcquire()僅在調(diào)用時此信號量存在一個可用許可,才從信號量獲取許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int) t _blank tryAcquire(intpermits)僅在調(diào)用時此信號量中有給定數(shù)目的許可時,才從此信號量中獲取這些許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int, long, java.util.concurrent.TimeUnit) t _blank tryAcquire(intp

18、ermits,longtimeout,TimeUnitunit)如果在給定的等待時間內(nèi)此信號量有可用的所有許可,并且當(dāng)前線程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,則從此信號量獲取給定數(shù)目的許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(long, java.util.concurrent.TimeUnit) t _blank tryAcquire(longtimeout,TimeUnitunit)如果在給定的等待時間

19、內(nèi),此信號量有可用的許可并且當(dāng)前線程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,則從此信號量獲取一個許可。示例:3個坑10個人廁所,有多少人都能裝,線程數(shù)動態(tài)變化,來一個人產(chǎn)生一個線程ExecutorServiceservice=Exccutors.newCachedThreadPool();finalSemaphoresp=newSemaphore(3);廁所中坑的個數(shù)指定只有3個3個坑,來了5個人,有2個人要等,其中有一個辦完事走了,等待的2個哪個先上呢?默認(rèn)的構(gòu)造方法不管,誰搶到了誰上。用new

20、Semaphore(3,true)就可以保證先來的先上。將坑的個數(shù)設(shè)置為1就可以達(dá)到互斥效果,每次只能有一個線程運行for(inti=0;i10;i+)來了10個人人的任務(wù)搶坑Runnablerunnable=newRunnable()publicvoidrun()sp.acquire();搶坑了會拋中斷異常有人占住坑了,給出提示SOP(currentThreadName+進(jìn)入,當(dāng)前已有(3-sp.availablePermits())個人了)Thread.sleep(5000)蹲坑辦事辦完事打聲招呼SOP(ThreadName即將離開)釋放坑的占有權(quán)sp.release();SOP(Thre

21、adName已經(jīng)走了,還有sp.availablePermits()個坑可用)開始任務(wù)吧service.execute(runnable)傳統(tǒng)互斥只能內(nèi)部釋放鎖this.unlock(),進(jìn)去this.lock()暈倒了別人就沒法進(jìn)去了;用信號燈可以外部釋放,其他線程可以釋放再獲取sp.release()sp.acquire()。-15.java5的CyclicBarrier同步工具例如:組織人員(線程)郊游,約定一個時間地點(路障),人員陸續(xù)到達(dá)地點,等所有人員全部到達(dá),開始到公園各玩各的,再到約定時間去食堂吃飯,等所有人到齊開飯java.util.concurrent.CyclicBarr

22、ier一個同步輔助類,它允許一組線程互相等待,直到到達(dá)某個公共屏障點(commonbarrierpoint)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時CyclicBarrier很有用。因為該barrier在釋放等待線程后可以重用,所以稱它為循環(huán)的barrier。CyclicBarrier支持一個可選的Runnable命令,在一組線程中的最后一個線程到達(dá)之后(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續(xù)所有參與線程之前更新共享狀態(tài),此屏障操作很有用。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Cyc

23、licBarrier(int) t _blank CyclicBarrier(intparties)創(chuàng)建一個新的CyclicBarrier,它將在給定數(shù)量的參與者(線程)處于等待狀態(tài)時啟動,但它不會在啟動barrier時執(zhí)行預(yù)定義的操作。 HYPERLINK /qzone/newblog/v5/editor.html l CyclicBarrier(int, java.lang.Runnable) t _blank CyclicBarrier(intparties,RunnablebarrierAction)創(chuàng)建一個新的CyclicBarrier,它將在給定數(shù)量的參與者(線程)處于等待狀態(tài)時啟

24、動,并在啟動barrier時執(zhí)行給定的屏障操作,該操作由最后一個進(jìn)入barrier的線程執(zhí)行。方法摘要int HYPERLINK /qzone/newblog/v5/editor.html l await() t _blank await()在所有 HYPERLINK /qzone/newblog/v5/editor.html l getParties() t _blank 參與者都已經(jīng)在此barrier上調(diào)用await方法之前,將一直等待。int HYPERLINK /qzone/newblog/v5/editor.html l await(long, java.util.concurren

25、t.TimeUnit) t _blank await(longtimeout,TimeUnitunit)在所有 HYPERLINK /qzone/newblog/v5/editor.html l getParties() t _blank 參與者都已經(jīng)在此屏障上調(diào)用await方法之前將一直等待,或者超出了指定的等待時間。int HYPERLINK /qzone/newblog/v5/editor.html l getNumberWaiting() t _blank getNumberWaiting()返回當(dāng)前在屏障處等待的參與者數(shù)目。int HYPERLINK /qzone/newblog/v

26、5/editor.html l getParties() t _blank getParties()返回要求啟動此barrier的參與者數(shù)目。boolean HYPERLINK /qzone/newblog/v5/editor.html l isBroken() t _blank isBroken()查詢此屏障是否處于損壞狀態(tài)。void HYPERLINK /qzone/newblog/v5/editor.html l reset() t _blank reset()將屏障重置為其初始狀態(tài)。例:ExecutorServiceservice=Executors.newCachedThreadPo

27、ol();finalCyclicBarriercb=newCyclicBarrier(3);約定3個人for(inti=0;i3;i+)產(chǎn)生3個人每個人的任務(wù)Runnablerunnable=newRunnable()publicvoidrun()開始出發(fā)到目的地Thread.sleep(long)Math.random()*1000);SOP(ThreadName即將到達(dá)集合點1,當(dāng)前已有cb.getNumberWaiting()+1個+(cb.getNumberWaiting()=2?都到齊了,繼續(xù)走啊:正在等候)cb.await();到了其他人沒來就等人到齊了再繼續(xù)進(jìn)行Thread.sl

28、eep(long)Math.random()*1000);SOP(ThreadName即將到達(dá)集合點2)cb.await();到了其他人沒來就等service.execute(runnable);-16.java5的CountDownLatch同步工具好像倒計時計數(shù)器,調(diào)用CountDownLatch對象的countDown方法就將計數(shù)器減1,當(dāng)?shù)竭_(dá)0時,所有等待者就開始執(zhí)行。舉例:多個運動員等待裁判命令:裁判等所有運動員到齊后發(fā)布結(jié)果代碼示例:ExecutorServiceservice=Executors.newCachedThreadPool();裁判發(fā)布命令的計數(shù)器,計數(shù)器為0,運動員

29、就跑finalCountDownLatchcdOrder=newCountDownLatch(1);運動員跑到終點的計數(shù)器,為0裁判宣布結(jié)果finalCountDownLatchcdAnswer=newCountDownLatch(3);產(chǎn)生3個運動員for(inti=0;i3;i+)運動員的任務(wù)Runnablerunnable=newRunnable()publicvoidrun()SOP(ThreadName準(zhǔn)備接受命令)等待發(fā)布命令cdOrder.await();計數(shù)器為0繼續(xù)向下執(zhí)行SOP(ThreadName已接受命令)order計數(shù)器為0了Thread.sleep(Random);

30、開始跑步cdAnswer.countDown();跑到終點了,計數(shù)器減1;service.execute(runnable);運動員開始任務(wù)Thread.sleep(1000)裁判休息一會再發(fā)布命令SOP(即將發(fā)布命令)cdOrder.countDown();命令計數(shù)器置為0,發(fā)布命令SOP(命令已經(jīng)發(fā)布,等待結(jié)果)cdAnswer.await();等待所有運動員,計數(shù)器為0所有運動員到位SOP(宣布結(jié)果)java.util.concurrent.CountDownLatch一個同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個或多個線程一直等待。用給定的計數(shù)初始化CountDow

31、nLatch。由于調(diào)用了countDown()方法,所以在當(dāng)前計數(shù)到達(dá)零之前,await方法會一直受阻塞。之后,會釋放所有等待的線程,await的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次計數(shù)無法被重置。如果需要重置計數(shù),請考慮使用CyclicBarrier。CountDownLatch是一個通用同步工具,它有很多用途。將計數(shù)1初始化的CountDownLatch用作一個簡單的開/關(guān)鎖存器,或入口:在通過調(diào)用countDown()的線程打開入口前,所有調(diào)用await的線程都一直在入口處等待。用N初始化的CountDownLatch可以使一個線程在N個線程完成某項操作之前一直等待,或者使其在某

32、項操作完成N次之前一直等待。CountDownLatch的一個有用特性是,它不要求調(diào)用countDown方法的線程等到計數(shù)到達(dá)零時才繼續(xù),而在所有線程都能通過之前,它只是阻止任何線程繼續(xù)通過一個await。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l CountDownLatch(int) t _blank CountDownLatch(intcount)構(gòu)造一個用給定計數(shù)初始化的CountDownLatch。方法摘要void HYPERLINK /qzone/newblog/v5/editor.html l await() t _blank

33、 await()使當(dāng)前線程在鎖存器倒計數(shù)至零之前一直等待,除非線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷。boolean HYPERLINK /qzone/newblog/v5/editor.html l await(long, java.util.concurrent.TimeUnit) t _blank await(longtimeout,TimeUnitunit)使當(dāng)前線程在鎖存器倒計數(shù)至零之前一直等待,除非線程被 HYPERLINK /qzone/newblog/v5/editor.html

34、 l interrupt() t _blank 中斷或超出了指定的等待時間。void HYPERLINK /qzone/newblog/v5/editor.html l countDown() t _blank countDown()遞減鎖存器的計數(shù),如果計數(shù)到達(dá)零,則釋放所有等待的線程。long HYPERLINK /qzone/newblog/v5/editor.html l getCount() t _blank getCount()返回當(dāng)前計數(shù)。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank to

35、String()返回標(biāo)識此鎖存器及其狀態(tài)的字符串。-17.java5的Exchanger同步工具用于實現(xiàn)兩個人之間的數(shù)據(jù)交換,每個人在完成一定的事務(wù)后想與對方交換數(shù)據(jù),第一個先拿出數(shù)據(jù)的人會一直等待第二個人,直到第二個人拿著數(shù)據(jù)到來時,才能彼此交換數(shù)據(jù)。舉例:毒品交易雙方并不是同時到達(dá),有先有后,只有都到達(dá)了,瞬間交換數(shù)據(jù),各自飛代碼演示:ExecutorServiceservice=Executors.newCachedThreadPool();finalExchangerexchanger=newExchanger();毒販:service.execute(newRunnable()毒販做

36、的事publicvoidrun()String(毒品)data1=毒品SOP(毒販正在將data1換出去)Thread.sleep(Random)換的過程毒販到位了,拿著毒品等待毒人接頭,接頭后就能換到錢了Stringdata2=(String)exchanger.exchange(data1);SOP(毒販換到了錢:data2);毒人:service.execute(newRunnable()吸毒人做的事publicvoidrun()String(錢)data1=錢SOP(毒人正在將data1換出去)Thread.sleep(Random)換的過程吸毒人到位了,拿著錢等待毒販接頭,接頭后就能

37、換到毒品了Stringdata2=(String)exchanger.exchange(data1);SOP(毒人換到了毒品:data2);java.util.concurrent.ExchangerV-可以交換的對象類型可以在對中對元素進(jìn)行配對和交換的線程的同步點。每個線程將條目上的某個方法呈現(xiàn)給exchange方法,與伙伴線程進(jìn)行匹配,并且在返回時接收其伙伴的對象。Exchanger可能被視為SynchronousQueue的雙向形式。Exchanger可能在應(yīng)用程序(比如遺傳算法和管道設(shè)計)中很有用。用法示例:以下是重點介紹的一個類,該類使用Exchanger在線程間交換緩沖區(qū),因此,在

38、需要時,填充緩沖區(qū)的線程獲取一個新騰空的緩沖區(qū),并將填滿的緩沖區(qū)傳遞給騰空緩沖區(qū)的線程。classFillAndEmptyExchangerexchanger=newExchanger();DataBufferinitialEmptyBuffer=.amade-uptypeDataBufferinitialFullBuffer=.classFillingLoopimplementsRunnablepublicvoidrun()DataBuffercurrentBuffer=initialEmptyBuffer;trywhile(currentBuffer!=null)addToBuffer(c

39、urrentBuffer);if(currentBuffer.isFull()currentBuffer=exchanger.exchange(currentBuffer);catch(InterruptedExceptionex).handle.classEmptyingLoopimplementsRunnablepublicvoidrun()DataBuffercurrentBuffer=initialFullBuffer;trywhile(currentBuffer!=null)takeFromBuffer(currentBuffer);if(currentBuffer.isEmpty(

40、)currentBuffer=exchanger.exchange(currentBuffer);catch(InterruptedExceptionex).handle.voidstart()newThread(newFillingLoop().start();newThread(newEmptyingLoop().start();構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Exchanger() t _blank Exchanger()創(chuàng)建一個新的Exchanger。方法摘要V HYPERLINK /qzone/newblog/v5/e

41、ditor.html l exchange(V) t _blank exchange(Vx)等待另一個線程到達(dá)此交換點(除非當(dāng)前線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷),然后將給定的對象傳送給該線程,并接收該線程的對象。V HYPERLINK /qzone/newblog/v5/editor.html l exchange(V, long, java.util.concurrent.TimeUnit) t _blank exchange(Vx,longtimeout,TimeUnitunit)等

42、待另一個線程到達(dá)此交換點(除非當(dāng)前線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,或者超出了指定的等待時間),然后將給定的對象傳送給該線程,同時接收該線程的對象。-18.java5阻塞隊列的應(yīng)用隊列包含固定長度的隊列和不固定長度的隊列,先進(jìn)先出固定長度的隊列往里放數(shù)據(jù),如果放滿了還要放,阻塞式隊列就會等待,直到有數(shù)據(jù)取出,空出位置后才繼續(xù)放;非阻塞式隊列不能等待就只能報錯了。講Condition時提到了阻塞隊列的原理,Java中已經(jīng)實現(xiàn)了阻塞隊列ArrayBlockingQueueBlockingQue

43、uepublicinterfaceBlockingQueueextendsQueue支持兩個附加操作的Queue,這兩個操作是:獲取元素時等待隊列變?yōu)榉强眨约按鎯υ貢r等待空間變得可用。BlockingQueue方法以四種形式出現(xiàn),對于不能立即滿足但可能在將來某一時刻可以滿足的操作,這四種形式的處理方式不同:第一種是拋出一個異常,第二種是返回一個特殊值(null或false,具體取決于操作),第三種是在操作可以成功前,無限期地阻塞當(dāng)前線程,第四種是在放棄前只在給定的最大時間限制內(nèi)阻塞。下表中總結(jié)了這些方法:拋出異常特殊值阻塞超時插入 HYPERLINK /qzone/newblog/v5/e

44、ditor.html l add(E) t _blank add(e) HYPERLINK /qzone/newblog/v5/editor.html l offer(E) t _blank offer(e) HYPERLINK /qzone/newblog/v5/editor.html l put(E) t _blank put(e) HYPERLINK /qzone/newblog/v5/editor.html l offer(E, long, java.util.concurrent.TimeUnit) t _blank offer(e,time,unit)移除 HYPERLINK /q

45、zone/newblog/v5/editor.html l remove(java.lang.Object) t _blank remove() HYPERLINK /qzone/newblog/v5/editor.html l poll(long, java.util.concurrent.TimeUnit) t _blank poll() HYPERLINK /qzone/newblog/v5/editor.html l take() t _blank take() HYPERLINK /qzone/newblog/v5/editor.html l poll(long, java.util

46、.concurrent.TimeUnit) t _blank poll(time,unit)檢查 HYPERLINK /qzone/newblog/v5/editor.html l element() t _blank element() HYPERLINK /qzone/newblog/v5/editor.html l peek() t _blank peek()不可用不可用BlockingQueue不接受null元素。試圖add、put或offer一個null元素時,某些實現(xiàn)會拋出NullPointerException。null被用作指示poll操作失敗的警戒值。BlockingQueu

47、e可以是限定容量的。它在任意給定時間都可以有一個remainingCapacity,超出此容量,便無法無阻塞地put附加元素。沒有任何內(nèi)部容量約束的BlockingQueue總是報告Integer.MAX_VALUE的剩余容量。BlockingQueue實現(xiàn)主要用于生產(chǎn)者-使用者隊列,但它另外還支持Collection接口。因此,舉例來說,使用remove(x)從隊列中移除任意一個元素是有可能的。然而,這種操作通常不會有效執(zhí)行,只能有計劃地偶爾使用,比如在取消排隊信息時。BlockingQueue實現(xiàn)是線程安全的。所有排隊方法都可以使用內(nèi)部鎖或其他形式的并發(fā)控制來自動達(dá)到它們的目的。然而,大量

48、的Collection操作(addAll、containsAll、retainAll和removeAll)沒有必要自動執(zhí)行,除非在實現(xiàn)中特別說明。因此,舉例來說,在只添加了c中的一些元素后,addAll(c)有可能失?。⊕伋鲆粋€異常)。java.util.concurrent.ArrayBlockingQueueE-在此collection中保持的元素類型extendsAbstractQueueimplementsBlockingQueue,Serializable一個由數(shù)組支持的有界阻塞隊列。此隊列按FIFO(先進(jìn)先出)原則對元素進(jìn)行排序。隊列的頭部是在隊列中存在時間最長的元素。隊列的尾部是

49、在隊列中存在時間最短的元素。新元素插入到隊列的尾部,隊列獲取操作則是從隊列頭部開始獲得元素。這是一個典型的“有界緩存區(qū)”,固定大小的數(shù)組在其中保持生產(chǎn)者插入的元素和使用者提取的元素。一旦創(chuàng)建了這樣的緩存區(qū),就不能再增加其容量。試圖向已滿隊列中放入元素會導(dǎo)致操作受阻塞;試圖從空隊列中提取元素將導(dǎo)致類似阻塞。此類支持對等待的生產(chǎn)者線程和使用者線程進(jìn)行排序的可選公平策略。默認(rèn)情況下,不保證是這種排序。然而,通過將公平性(fairness)設(shè)置為true而構(gòu)造的隊列允許按照FIFO順序訪問線程。公平性通常會降低吞吐量,但也減少了可變性和避免了“不平衡性”。此類及其迭代器實現(xiàn)了Collection和It

50、erator接口的所有可選方法。此類是JavaCollectionsFramework的成員。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int) t _blank ArrayBlockingQueue(intcapacity)創(chuàng)建一個帶有給定的(固定)容量和默認(rèn)訪問策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean) t _blank ArrayBlocking

51、Queue(intcapacity,booleanfair)創(chuàng)建一個具有給定的(固定)容量和指定訪問策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean, java.util.Collection) t _blank ArrayBlockingQueue(intcapacity,booleanfair,Collectionc)創(chuàng)建一個具有給定的(固定)容量和指定訪問策略的ArrayBlockingQueue,它最初包含給定collection的元素,并以c

52、ollection迭代器的遍歷順序添加元素。方法摘要boolean HYPERLINK /qzone/newblog/v5/editor.html l add(E) t _blank add(Ee)將指定的元素插入到此隊列的尾部(如果立即可行且不會超過該隊列的容量),在成功時返回true,如果此隊列已滿,則拋出IllegalStateException。void HYPERLINK /qzone/newblog/v5/editor.html l clear() t _blank clear()自動移除此隊列中的所有元素。boolean HYPERLINK /qzone/newblog/v5/e

53、ditor.html l contains(java.lang.Object) t _blank contains(Objecto)如果此隊列包含指定的元素,則返回 HYPERLINK /qzone/newblog/v5/editor.html l drainTo(java.util.Collection) t _blank drainTo(Collectionc)移除此隊列中所有可用的元素,并將它們添加到給定collection中。int HYPERLINK /qzone/newblog/v5/editor.html l drainTo(java.util.Collectio

54、n, int) t _blank drainTo(Collectionc,intmaxElements)最多從此隊列中移除給定數(shù)量的可用元素,并將這些元素添加到給定collection中。Iterator HYPERLINK /qzone/newblog/v5/editor.html l iterator() t _blank iterator()返回在此隊列中的元素上按適當(dāng)順序進(jìn)行迭代的迭代器。boolean HYPERLINK /qzone/newblog/v5/editor.html l offer(E) t _blank offer(Ee)將指定的元素插入到此隊列的尾部(如果立即可行且

55、不會超過該隊列的容量),在成功時返回true,如果此隊列已滿,則返回false。boolean HYPERLINK /qzone/newblog/v5/editor.html l offer(E, long, java.util.concurrent.TimeUnit) t _blank offer(Ee,longtimeout,TimeUnitunit)將指定的元素插入此隊列的尾部,如果該隊列已滿,則在到達(dá)指定的等待時間之前等待可用的空間。E HYPERLINK /qzone/newblog/v5/editor.html l peek() t _blank peek()獲取但不移除此隊列的頭

56、;如果此隊列為空,則返回null。E HYPERLINK /qzone/newblog/v5/editor.html l poll() t _blank poll()獲取并移除此隊列的頭,如果此隊列為空,則返回null。E HYPERLINK /qzone/newblog/v5/editor.html l poll(long, java.util.concurrent.TimeUnit) t _blank poll(longtimeout,TimeUnitunit)獲取并移除此隊列的頭部,在指定的等待時間前等待可用的元素(如果有必要)。void HYPERLINK /qzone/newblog

57、/v5/editor.html l put(E) t _blank put(Ee)將指定的元素插入此隊列的尾部,如果該隊列已滿,則等待可用的空間。int HYPERLINK /qzone/newblog/v5/editor.html l remainingCapacity() t _blank remainingCapacity()返回在無阻塞的理想情況下(不存在內(nèi)存或資源約束)此隊列能接受的其他元素數(shù)量。boolean HYPERLINK /qzone/newblog/v5/editor.html l remove(java.lang.Object) t _blank remove(Objecto)從此隊列中移除指定元素的單個實例(如果存在)。int HYPERLINK /qzone/newblog/v5/editor.html l size() t _blank siz

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論