版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、技術(shù)總結(jié)多線程與并發(fā)庫高級(jí)應(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ù)實(shí)現(xiàn)的互斥只能一個(gè)線程單獨(dú)干,不能說這個(gè)線程干完了通知另一個(gè)線程來干,Condition就是解決這個(gè)問題的,實(shí)現(xiàn)線程間的通信。比如CPU讓小弟做事,小弟說我先歇著并通知大哥,大哥就開始做事。publicinterfaceConditionCondit
2、ion將Object監(jiān)視器方法(wait、notify和notifyAll)分解成截然不同的對(duì)象,以便通過將這些對(duì)象與任意Lock實(shí)現(xiàn)組合使用,為每個(gè)對(duì)象提供多個(gè)等待set(wait-set)。其中,Lock替代了synchronized方法和語句的使用,Condition替代了Object監(jiān)視器方法的使用。Condition實(shí)例實(shí)質(zhì)上被綁定到一個(gè)鎖上。要為特定Lock實(shí)例獲得Condition實(shí)例,請(qǐng)使用其newCondition()方法。作為一個(gè)示例,假定有一個(gè)綁定的緩沖區(qū),它支持put和take方法。如果試圖在空的緩沖區(qū)上執(zhí)行take操作,則在某一個(gè)項(xiàng)變得可用之前,線程將一直阻塞;如果試
3、圖在滿的緩沖區(qū)上執(zhí)行put操作,則在有空間變得可用之前,線程將一直阻塞。我們喜歡在單獨(dú)的等待set中保存put線程和take線程,這樣就可以在緩沖區(qū)中的項(xiàng)或空間變得可用時(shí)利用最佳規(guī)劃,一次只通知一個(gè)線程??梢允褂脙蓚€(gè)Condition實(shí)例來做到這一點(diǎn)。classBoundedBuffer阻塞隊(duì)列滿了不能放,空了不能取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()注意:判斷條件時(shí)用while防止虛假喚醒,等待在那里,喚醒后再進(jìn)行判斷,確認(rèn)符合要求
6、后再執(zhí)行任務(wù)。-14.java5的Semaphore同步工具Semaphore可以維護(hù)當(dāng)前訪問自身的線程個(gè)數(shù),并且提供了同步機(jī)制。semaphore實(shí)現(xiàn)的功能類似于廁所里有5個(gè)坑,有10個(gè)人要上廁所,同時(shí)就只能有5個(gè)人占用,當(dāng)5個(gè)人中的任何一個(gè)讓開后,其中在等待的另外5個(gè)人中又有一個(gè)可以占用了。java.util.concurrent.Semaphore一個(gè)計(jì)數(shù)信號(hào)量。從概念上講,信號(hào)量維護(hù)了一個(gè)許可集。如有必要,在許可可用前會(huì)阻塞每一個(gè)acquire(),然后再獲取該許可。每個(gè)release()添加一個(gè)許可,從而可能釋放一個(gè)正在阻塞的獲取者。但是,不使用實(shí)際的許可對(duì)象,Semaphore只對(duì)
7、可用許可的號(hào)碼進(jìn)行計(jì)數(shù),并采取相應(yīng)的行動(dòng)。Semaphore通常用于限制可以訪問某些資源(物理或邏輯的)的線程數(shù)目。例如,下面的類使用信號(hào)量控制對(duì)內(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;獲得一項(xiàng)前,每個(gè)線程必須從信號(hào)量獲取許可,從而保證可以使用該項(xiàng)。該線程結(jié)束后,將項(xiàng)返回到池中并將許可返回到該信號(hào)量,從而允許其他線程獲取該項(xiàng)。注意,調(diào)用acquire()時(shí)無法保持同步鎖,因?yàn)檫@會(huì)阻止將項(xiàng)返回到池中。
10、信號(hào)量封裝所需的同步,以限制對(duì)池的訪問,這同維持該池本身一致性所需的同步是分開的。構(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()從此信號(hào)量獲取一個(gè)許可,在提供一個(gè)許可前一直將線程阻塞,否則線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷。void HYPERLINK /qzone/newblog/v5/editor.html l acquire(int) t _blank acquire(intpermits)從此信號(hào)量獲取給定數(shù)目的許可,在提供這些許可前一直將線程阻塞
12、,或者線程已被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷。void HYPERLINK /qzone/newblog/v5/editor.html l acquireUninterruptibly() t _blank acquireUninterruptibly()從此信號(hào)量中獲取許可,在有可用的許可前將其阻塞。void HYPERLINK /qzone/newblog/v5/editor.html l acquireUninterruptibly(int) t _blank acquireUninte
13、rruptibly(intpermits)從此信號(hào)量獲取給定數(shù)目的許可,在提供這些許可前一直將線程阻塞。int HYPERLINK /qzone/newblog/v5/editor.html l availablePermits() t _blank availablePermits()返回此信號(hào)量中當(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()返回一個(gè)collection,包含可能等待獲取的線程。int HYPERLINK /qzone/newblog/v5/editor.html l getQueueLength() t _blank getQueueLength()返回正在等待獲取的線程的估計(jì)數(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()如果此信號(hào)量的公平設(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()釋放一個(gè)許可,將其返回給信號(hào)量。void HYPERLINK /qzone/newblog/v5/editor.html l release(int) t _blank release(intpermits)釋放給定數(shù)目的許可,將其返回到信號(hào)量。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank toString()返回標(biāo)識(shí)此信號(hào)量的字符串,以及信號(hào)量的狀態(tài)。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire() t _blan
17、k tryAcquire()僅在調(diào)用時(shí)此信號(hào)量存在一個(gè)可用許可,才從信號(hào)量獲取許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int) t _blank tryAcquire(intpermits)僅在調(diào)用時(shí)此信號(hào)量中有給定數(shù)目的許可時(shí),才從此信號(hào)量中獲取這些許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int, long, java.util.concurrent.TimeUnit) t _blank tryAcquire(intp
18、ermits,longtimeout,TimeUnitunit)如果在給定的等待時(shí)間內(nèi)此信號(hào)量有可用的所有許可,并且當(dāng)前線程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,則從此信號(hào)量獲取給定數(shù)目的許可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(long, java.util.concurrent.TimeUnit) t _blank tryAcquire(longtimeout,TimeUnitunit)如果在給定的等待時(shí)間
19、內(nèi),此信號(hào)量有可用的許可并且當(dāng)前線程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,則從此信號(hào)量獲取一個(gè)許可。示例:3個(gè)坑10個(gè)人廁所,有多少人都能裝,線程數(shù)動(dòng)態(tài)變化,來一個(gè)人產(chǎn)生一個(gè)線程ExecutorServiceservice=Exccutors.newCachedThreadPool();finalSemaphoresp=newSemaphore(3);廁所中坑的個(gè)數(shù)指定只有3個(gè)3個(gè)坑,來了5個(gè)人,有2個(gè)人要等,其中有一個(gè)辦完事走了,等待的2個(gè)哪個(gè)先上呢?默認(rèn)的構(gòu)造方法不管,誰搶到了誰上。用new
20、Semaphore(3,true)就可以保證先來的先上。將坑的個(gè)數(shù)設(shè)置為1就可以達(dá)到互斥效果,每次只能有一個(gè)線程運(yùn)行for(inti=0;i10;i+)來了10個(gè)人人的任務(wù)搶坑Runnablerunnable=newRunnable()publicvoidrun()sp.acquire();搶坑了會(huì)拋中斷異常有人占住坑了,給出提示SOP(currentThreadName+進(jìn)入,當(dāng)前已有(3-sp.availablePermits())個(gè)人了)Thread.sleep(5000)蹲坑辦事辦完事打聲招呼SOP(ThreadName即將離開)釋放坑的占有權(quán)sp.release();SOP(Thre
21、adName已經(jīng)走了,還有sp.availablePermits()個(gè)坑可用)開始任務(wù)吧service.execute(runnable)傳統(tǒng)互斥只能內(nèi)部釋放鎖this.unlock(),進(jìn)去this.lock()暈倒了別人就沒法進(jìn)去了;用信號(hào)燈可以外部釋放,其他線程可以釋放再獲取sp.release()sp.acquire()。-15.java5的CyclicBarrier同步工具例如:組織人員(線程)郊游,約定一個(gè)時(shí)間地點(diǎn)(路障),人員陸續(xù)到達(dá)地點(diǎn),等所有人員全部到達(dá),開始到公園各玩各的,再到約定時(shí)間去食堂吃飯,等所有人到齊開飯java.util.concurrent.CyclicBarr
22、ier一個(gè)同步輔助類,它允許一組線程互相等待,直到到達(dá)某個(gè)公共屏障點(diǎn)(commonbarrierpoint)。在涉及一組固定大小的線程的程序中,這些線程必須不時(shí)地互相等待,此時(shí)CyclicBarrier很有用。因?yàn)樵揵arrier在釋放等待線程后可以重用,所以稱它為循環(huán)的barrier。CyclicBarrier支持一個(gè)可選的Runnable命令,在一組線程中的最后一個(gè)線程到達(dá)之后(但在釋放所有線程之前),該命令只在每個(gè)屏障點(diǎn)運(yùn)行一次。若在繼續(xù)所有參與線程之前更新共享狀態(tài),此屏障操作很有用。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Cyc
23、licBarrier(int) t _blank CyclicBarrier(intparties)創(chuàng)建一個(gè)新的CyclicBarrier,它將在給定數(shù)量的參與者(線程)處于等待狀態(tài)時(shí)啟動(dòng),但它不會(huì)在啟動(dòng)barrier時(shí)執(zhí)行預(yù)定義的操作。 HYPERLINK /qzone/newblog/v5/editor.html l CyclicBarrier(int, java.lang.Runnable) t _blank CyclicBarrier(intparties,RunnablebarrierAction)創(chuàng)建一個(gè)新的CyclicBarrier,它將在給定數(shù)量的參與者(線程)處于等待狀態(tài)時(shí)啟
24、動(dòng),并在啟動(dòng)barrier時(shí)執(zhí)行給定的屏障操作,該操作由最后一個(gè)進(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方法之前將一直等待,或者超出了指定的等待時(shí)間。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()返回要求啟動(dòng)此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個(gè)人for(inti=0;i3;i+)產(chǎn)生3個(gè)人每個(gè)人的任務(wù)Runnablerunnable=newRunnable()publicvoidrun()開始出發(fā)到目的地Thread.sleep(long)Math.random()*1000);SOP(ThreadName即將到達(dá)集合點(diǎn)1,當(dāng)前已有cb.getNumberWaiting()+1個(gè)+(cb.getNumberWaiting()=2?都到齊了,繼續(xù)走啊:正在等候)cb.await();到了其他人沒來就等人到齊了再繼續(xù)進(jìn)行Thread.sl
28、eep(long)Math.random()*1000);SOP(ThreadName即將到達(dá)集合點(diǎn)2)cb.await();到了其他人沒來就等service.execute(runnable);-16.java5的CountDownLatch同步工具好像倒計(jì)時(shí)計(jì)數(shù)器,調(diào)用CountDownLatch對(duì)象的countDown方法就將計(jì)數(shù)器減1,當(dāng)?shù)竭_(dá)0時(shí),所有等待者就開始執(zhí)行。舉例:多個(gè)運(yùn)動(dòng)員等待裁判命令:裁判等所有運(yùn)動(dòng)員到齊后發(fā)布結(jié)果代碼示例:ExecutorServiceservice=Executors.newCachedThreadPool();裁判發(fā)布命令的計(jì)數(shù)器,計(jì)數(shù)器為0,運(yùn)動(dòng)員
29、就跑finalCountDownLatchcdOrder=newCountDownLatch(1);運(yùn)動(dòng)員跑到終點(diǎn)的計(jì)數(shù)器,為0裁判宣布結(jié)果finalCountDownLatchcdAnswer=newCountDownLatch(3);產(chǎn)生3個(gè)運(yùn)動(dòng)員for(inti=0;i3;i+)運(yùn)動(dòng)員的任務(wù)Runnablerunnable=newRunnable()publicvoidrun()SOP(ThreadName準(zhǔn)備接受命令)等待發(fā)布命令cdOrder.await();計(jì)數(shù)器為0繼續(xù)向下執(zhí)行SOP(ThreadName已接受命令)order計(jì)數(shù)器為0了Thread.sleep(Random);
30、開始跑步cdAnswer.countDown();跑到終點(diǎn)了,計(jì)數(shù)器減1;service.execute(runnable);運(yùn)動(dòng)員開始任務(wù)Thread.sleep(1000)裁判休息一會(huì)再發(fā)布命令SOP(即將發(fā)布命令)cdOrder.countDown();命令計(jì)數(shù)器置為0,發(fā)布命令SOP(命令已經(jīng)發(fā)布,等待結(jié)果)cdAnswer.await();等待所有運(yùn)動(dòng)員,計(jì)數(shù)器為0所有運(yùn)動(dòng)員到位SOP(宣布結(jié)果)java.util.concurrent.CountDownLatch一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待。用給定的計(jì)數(shù)初始化CountDow
31、nLatch。由于調(diào)用了countDown()方法,所以在當(dāng)前計(jì)數(shù)到達(dá)零之前,await方法會(huì)一直受阻塞。之后,會(huì)釋放所有等待的線程,await的所有后續(xù)調(diào)用都將立即返回。這種現(xiàn)象只出現(xiàn)一次計(jì)數(shù)無法被重置。如果需要重置計(jì)數(shù),請(qǐng)考慮使用CyclicBarrier。CountDownLatch是一個(gè)通用同步工具,它有很多用途。將計(jì)數(shù)1初始化的CountDownLatch用作一個(gè)簡單的開/關(guān)鎖存器,或入口:在通過調(diào)用countDown()的線程打開入口前,所有調(diào)用await的線程都一直在入口處等待。用N初始化的CountDownLatch可以使一個(gè)線程在N個(gè)線程完成某項(xiàng)操作之前一直等待,或者使其在某
32、項(xiàng)操作完成N次之前一直等待。CountDownLatch的一個(gè)有用特性是,它不要求調(diào)用countDown方法的線程等到計(jì)數(shù)到達(dá)零時(shí)才繼續(xù),而在所有線程都能通過之前,它只是阻止任何線程繼續(xù)通過一個(gè)await。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l CountDownLatch(int) t _blank CountDownLatch(intcount)構(gòu)造一個(gè)用給定計(jì)數(shù)初始化的CountDownLatch。方法摘要void HYPERLINK /qzone/newblog/v5/editor.html l await() t _blank
33、 await()使當(dāng)前線程在鎖存器倒計(jì)數(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)前線程在鎖存器倒計(jì)數(shù)至零之前一直等待,除非線程被 HYPERLINK /qzone/newblog/v5/editor.html
34、 l interrupt() t _blank 中斷或超出了指定的等待時(shí)間。void HYPERLINK /qzone/newblog/v5/editor.html l countDown() t _blank countDown()遞減鎖存器的計(jì)數(shù),如果計(jì)數(shù)到達(dá)零,則釋放所有等待的線程。long HYPERLINK /qzone/newblog/v5/editor.html l getCount() t _blank getCount()返回當(dāng)前計(jì)數(shù)。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank to
35、String()返回標(biāo)識(shí)此鎖存器及其狀態(tài)的字符串。-17.java5的Exchanger同步工具用于實(shí)現(xiàn)兩個(gè)人之間的數(shù)據(jù)交換,每個(gè)人在完成一定的事務(wù)后想與對(duì)方交換數(shù)據(jù),第一個(gè)先拿出數(shù)據(jù)的人會(huì)一直等待第二個(gè)人,直到第二個(gè)人拿著數(shù)據(jù)到來時(shí),才能彼此交換數(shù)據(jù)。舉例:毒品交易雙方并不是同時(shí)到達(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-可以交換的對(duì)象類型可以在對(duì)中對(duì)元素進(jìn)行配對(duì)和交換的線程的同步點(diǎn)。每個(gè)線程將條目上的某個(gè)方法呈現(xiàn)給exchange方法,與伙伴線程進(jìn)行匹配,并且在返回時(shí)接收其伙伴的對(duì)象。Exchanger可能被視為SynchronousQueue的雙向形式。Exchanger可能在應(yīng)用程序(比如遺傳算法和管道設(shè)計(jì))中很有用。用法示例:以下是重點(diǎn)介紹的一個(gè)類,該類使用Exchanger在線程間交換緩沖區(qū),因此,在
38、需要時(shí),填充緩沖區(qū)的線程獲取一個(gè)新騰空的緩沖區(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)建一個(gè)新的Exchanger。方法摘要V HYPERLINK /qzone/newblog/v5/e
41、ditor.html l exchange(V) t _blank exchange(Vx)等待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷),然后將給定的對(duì)象傳送給該線程,并接收該線程的對(duì)象。V HYPERLINK /qzone/newblog/v5/editor.html l exchange(V, long, java.util.concurrent.TimeUnit) t _blank exchange(Vx,longtimeout,TimeUnitunit)等
42、待另一個(gè)線程到達(dá)此交換點(diǎn)(除非當(dāng)前線程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中斷,或者超出了指定的等待時(shí)間),然后將給定的對(duì)象傳送給該線程,同時(shí)接收該線程的對(duì)象。-18.java5阻塞隊(duì)列的應(yīng)用隊(duì)列包含固定長度的隊(duì)列和不固定長度的隊(duì)列,先進(jìn)先出固定長度的隊(duì)列往里放數(shù)據(jù),如果放滿了還要放,阻塞式隊(duì)列就會(huì)等待,直到有數(shù)據(jù)取出,空出位置后才繼續(xù)放;非阻塞式隊(duì)列不能等待就只能報(bào)錯(cuò)了。講Condition時(shí)提到了阻塞隊(duì)列的原理,Java中已經(jīng)實(shí)現(xiàn)了阻塞隊(duì)列ArrayBlockingQueueBlockingQue
43、uepublicinterfaceBlockingQueueextendsQueue支持兩個(gè)附加操作的Queue,這兩個(gè)操作是:獲取元素時(shí)等待隊(duì)列變?yōu)榉强?,以及存?chǔ)元素時(shí)等待空間變得可用。BlockingQueue方法以四種形式出現(xiàn),對(duì)于不能立即滿足但可能在將來某一時(shí)刻可以滿足的操作,這四種形式的處理方式不同:第一種是拋出一個(gè)異常,第二種是返回一個(gè)特殊值(null或false,具體取決于操作),第三種是在操作可以成功前,無限期地阻塞當(dāng)前線程,第四種是在放棄前只在給定的最大時(shí)間限制內(nèi)阻塞。下表中總結(jié)了這些方法:拋出異常特殊值阻塞超時(shí)插入 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一個(gè)null元素時(shí),某些實(shí)現(xiàn)會(huì)拋出NullPointerException。null被用作指示poll操作失敗的警戒值。BlockingQueu
47、e可以是限定容量的。它在任意給定時(shí)間都可以有一個(gè)remainingCapacity,超出此容量,便無法無阻塞地put附加元素。沒有任何內(nèi)部容量約束的BlockingQueue總是報(bào)告Integer.MAX_VALUE的剩余容量。BlockingQueue實(shí)現(xiàn)主要用于生產(chǎn)者-使用者隊(duì)列,但它另外還支持Collection接口。因此,舉例來說,使用remove(x)從隊(duì)列中移除任意一個(gè)元素是有可能的。然而,這種操作通常不會(huì)有效執(zhí)行,只能有計(jì)劃地偶爾使用,比如在取消排隊(duì)信息時(shí)。BlockingQueue實(shí)現(xiàn)是線程安全的。所有排隊(duì)方法都可以使用內(nèi)部鎖或其他形式的并發(fā)控制來自動(dòng)達(dá)到它們的目的。然而,大量
48、的Collection操作(addAll、containsAll、retainAll和removeAll)沒有必要自動(dòng)執(zhí)行,除非在實(shí)現(xiàn)中特別說明。因此,舉例來說,在只添加了c中的一些元素后,addAll(c)有可能失?。⊕伋鲆粋€(gè)異常)。java.util.concurrent.ArrayBlockingQueueE-在此collection中保持的元素類型extendsAbstractQueueimplementsBlockingQueue,Serializable一個(gè)由數(shù)組支持的有界阻塞隊(duì)列。此隊(duì)列按FIFO(先進(jìn)先出)原則對(duì)元素進(jìn)行排序。隊(duì)列的頭部是在隊(duì)列中存在時(shí)間最長的元素。隊(duì)列的尾部是
49、在隊(duì)列中存在時(shí)間最短的元素。新元素插入到隊(duì)列的尾部,隊(duì)列獲取操作則是從隊(duì)列頭部開始獲得元素。這是一個(gè)典型的“有界緩存區(qū)”,固定大小的數(shù)組在其中保持生產(chǎn)者插入的元素和使用者提取的元素。一旦創(chuàng)建了這樣的緩存區(qū),就不能再增加其容量。試圖向已滿隊(duì)列中放入元素會(huì)導(dǎo)致操作受阻塞;試圖從空隊(duì)列中提取元素將導(dǎo)致類似阻塞。此類支持對(duì)等待的生產(chǎn)者線程和使用者線程進(jìn)行排序的可選公平策略。默認(rèn)情況下,不保證是這種排序。然而,通過將公平性(fairness)設(shè)置為true而構(gòu)造的隊(duì)列允許按照FIFO順序訪問線程。公平性通常會(huì)降低吞吐量,但也減少了可變性和避免了“不平衡性”。此類及其迭代器實(shí)現(xiàn)了Collection和It
50、erator接口的所有可選方法。此類是JavaCollectionsFramework的成員。構(gòu)造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int) t _blank ArrayBlockingQueue(intcapacity)創(chuàng)建一個(gè)帶有給定的(固定)容量和默認(rèn)訪問策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean) t _blank ArrayBlocking
51、Queue(intcapacity,booleanfair)創(chuàng)建一個(gè)具有給定的(固定)容量和指定訪問策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean, java.util.Collection) t _blank ArrayBlockingQueue(intcapacity,booleanfair,Collectionc)創(chuàng)建一個(gè)具有給定的(固定)容量和指定訪問策略的ArrayBlockingQueue,它最初包含給定collection的元素,并以c
52、ollection迭代器的遍歷順序添加元素。方法摘要boolean HYPERLINK /qzone/newblog/v5/editor.html l add(E) t _blank add(Ee)將指定的元素插入到此隊(duì)列的尾部(如果立即可行且不會(huì)超過該隊(duì)列的容量),在成功時(shí)返回true,如果此隊(duì)列已滿,則拋出IllegalStateException。void HYPERLINK /qzone/newblog/v5/editor.html l clear() t _blank clear()自動(dòng)移除此隊(duì)列中的所有元素。boolean HYPERLINK /qzone/newblog/v5/e
53、ditor.html l contains(java.lang.Object) t _blank contains(Objecto)如果此隊(duì)列包含指定的元素,則返回 HYPERLINK /qzone/newblog/v5/editor.html l drainTo(java.util.Collection) t _blank drainTo(Collectionc)移除此隊(duì)列中所有可用的元素,并將它們添加到給定collection中。int HYPERLINK /qzone/newblog/v5/editor.html l drainTo(java.util.Collectio
54、n, int) t _blank drainTo(Collectionc,intmaxElements)最多從此隊(duì)列中移除給定數(shù)量的可用元素,并將這些元素添加到給定collection中。Iterator HYPERLINK /qzone/newblog/v5/editor.html l iterator() t _blank iterator()返回在此隊(duì)列中的元素上按適當(dāng)順序進(jìn)行迭代的迭代器。boolean HYPERLINK /qzone/newblog/v5/editor.html l offer(E) t _blank offer(Ee)將指定的元素插入到此隊(duì)列的尾部(如果立即可行且
55、不會(huì)超過該隊(duì)列的容量),在成功時(shí)返回true,如果此隊(duì)列已滿,則返回false。boolean HYPERLINK /qzone/newblog/v5/editor.html l offer(E, long, java.util.concurrent.TimeUnit) t _blank offer(Ee,longtimeout,TimeUnitunit)將指定的元素插入此隊(duì)列的尾部,如果該隊(duì)列已滿,則在到達(dá)指定的等待時(shí)間之前等待可用的空間。E HYPERLINK /qzone/newblog/v5/editor.html l peek() t _blank peek()獲取但不移除此隊(duì)列的頭
56、;如果此隊(duì)列為空,則返回null。E HYPERLINK /qzone/newblog/v5/editor.html l poll() t _blank poll()獲取并移除此隊(duì)列的頭,如果此隊(duì)列為空,則返回null。E HYPERLINK /qzone/newblog/v5/editor.html l poll(long, java.util.concurrent.TimeUnit) t _blank poll(longtimeout,TimeUnitunit)獲取并移除此隊(duì)列的頭部,在指定的等待時(shí)間前等待可用的元素(如果有必要)。void HYPERLINK /qzone/newblog
57、/v5/editor.html l put(E) t _blank put(Ee)將指定的元素插入此隊(duì)列的尾部,如果該隊(duì)列已滿,則等待可用的空間。int HYPERLINK /qzone/newblog/v5/editor.html l remainingCapacity() t _blank remainingCapacity()返回在無阻塞的理想情況下(不存在內(nèi)存或資源約束)此隊(duì)列能接受的其他元素?cái)?shù)量。boolean HYPERLINK /qzone/newblog/v5/editor.html l remove(java.lang.Object) t _blank remove(Objecto)從此隊(duì)列中移除指定元素的單個(gè)實(shí)例(如果存在)。int HYPERLINK /qzone/newblog/v5/editor.html l size() t _blank siz
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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年安全生產(chǎn)責(zé)任基金抵押合同
- 2025年在線醫(yī)療健康平臺(tái)用戶注冊協(xié)議
- 2025年保密協(xié)議信息轉(zhuǎn)換書
- 2025年代理渠道合作協(xié)議
- 2025年旅游項(xiàng)目管理標(biāo)準(zhǔn)協(xié)議
- 《英語選修課》課件
- 2024 浙江公務(wù)員考試行測試題(A 類)
- 2025版美容護(hù)膚中心場地租賃合同范本4篇
- 2025版基礎(chǔ)設(shè)施建設(shè)工程施工合同終止補(bǔ)充協(xié)議2篇
- 買賣墓地合同(2024版)
- 2025年度房地產(chǎn)權(quán)證辦理委托代理合同典范3篇
- 職業(yè)衛(wèi)生培訓(xùn)課件
- 柴油墊資合同模板
- 湖北省五市州2023-2024學(xué)年高一下學(xué)期期末聯(lián)考數(shù)學(xué)試題
- 城市作戰(zhàn)案例研究報(bào)告
- 【正版授權(quán)】 ISO 12803:1997 EN Representative sampling of plutonium nitrate solutions for determination of plutonium concentration
- 道德經(jīng)全文及注釋
- 2024中考考前地理沖刺卷及答案(含答題卡)
- 多子女贍養(yǎng)老人協(xié)議書范文
- 彩票市場銷售計(jì)劃書
- 骨科抗菌藥物應(yīng)用分析報(bào)告
評(píng)論
0/150
提交評(píng)論