多线程与并发库高级应用三_第1页
多线程与并发库高级应用三_第2页
多线程与并发库高级应用三_第3页
多线程与并发库高级应用三_第4页
免费预览已结束,剩余8页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、技术总结多线程与并发库高级应用(三)- HYPERLINK / t _blank android培训、 HYPERLINK / t _blank java培训、期待与您交流! -13.java5条件阻塞Condition的应用Condition的功能类似在传统线程技术中的Object.wait()和Object.natify()的功能,传统线程技术实现的互斥只能一个线程单独干,不能说这个线程干完了通知另一个线程来干,Condition就是解决这个问题的,实现线程间的通信。比如CPU让小弟做事,小弟说我先歇着并通知大哥,大哥就开始做事。publicinterfaceConditionCondit

2、ion将Object监视器方法(wait、notify和notifyAll)分解成截然不同的对象,以便通过将这些对象与任意Lock实现组合使用,为每个对象提供多个等待set(wait-set)。其中,Lock替代了synchronized方法和语句的使用,Condition替代了Object监视器方法的使用。Condition实例实质上被绑定到一个锁上。要为特定Lock实例获得Condition实例,请使用其newCondition()方法。作为一个示例,假定有一个绑定的缓冲区,它支持put和take方法。如果试图在空的缓冲区上执行take操作,则在某一个项变得可用之前,线程将一直阻塞;如果试

3、图在满的缓冲区上执行put操作,则在有空间变得可用之前,线程将一直阻塞。我们喜欢在单独的等待set中保存put线程和take线程,这样就可以在缓冲区中的项或空间变得可用时利用最佳规划,一次只通知一个线程。可以使用两个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防止虚假唤醒,等待在那里,唤醒后再进行判断,确认符合要求

6、后再执行任务。-14.java5的Semaphore同步工具Semaphore可以维护当前访问自身的线程个数,并且提供了同步机制。semaphore实现的功能类似于厕所里有5个坑,有10个人要上厕所,同时就只能有5个人占用,当5个人中的任何一个让开后,其中在等待的另外5个人中又有一个可以占用了。java.util.concurrent.Semaphore一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对

7、可用许可的号码进行计数,并采取相应的行动。Semaphore通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。例如,下面的类使用信号量控制对内容池的访问: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;获得一项前,每个线程必须从信号量获取许可,从而保证可以使用该项。该线程结束后,将项返回到池中并将许可返回到该信号量,从而允许其他线程获取该项。注意,调用acquire()时无法保持同步锁,因为这会阻止将项返回到池中。

10、信号量封装所需的同步,以限制对池的访问,这同维持该池本身一致性所需的同步是分开的。构造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Semaphore(int) t _blank Semaphore(intpermits)创建具有给定的许可数和非公平的公平设置的Semaphore。 HYPERLINK /qzone/newblog/v5/editor.html l Semaphore(int, boolean) t _blank Semaphore(intpermits,booleanfair)创建具有给定的许可数和给定的公平设置的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)从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞

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)从此信号量获取给定数目的许可,在提供这些许可前一直将线程阻塞。int HYPERLINK /qzone/newblog/v5/editor.html l availablePermits() t _blank availablePermits()返回此信号量中当前可用的许可数。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()返回正在等待获取的线程的估计数目。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()如果此信号量的公平设置为true,则返回tectedvoid HYPERLINK /qzone/newblog/v5/editor.html l reducePermits(int) t _blank reducePermits(intreduction)根据指定的缩减量减小可用许可的数目。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)释放给定数目的许可,将其返回到信号量。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank toString()返回标识此信号量的字符串,以及信号量的状态。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire() t _blan

17、k tryAcquire()仅在调用时此信号量存在一个可用许可,才从信号量获取许可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int) t _blank tryAcquire(intpermits)仅在调用时此信号量中有给定数目的许可时,才从此信号量中获取这些许可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(int, long, java.util.concurrent.TimeUnit) t _blank tryAcquire(intp

18、ermits,longtimeout,TimeUnitunit)如果在给定的等待时间内此信号量有可用的所有许可,并且当前线程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中断,则从此信号量获取给定数目的许可。boolean HYPERLINK /qzone/newblog/v5/editor.html l tryAcquire(long, java.util.concurrent.TimeUnit) t _blank tryAcquire(longtimeout,TimeUnitunit)如果在给定的等待时间

19、内,此信号量有可用的许可并且当前线程未被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中断,则从此信号量获取一个许可。示例:3个坑10个人厕所,有多少人都能装,线程数动态变化,来一个人产生一个线程ExecutorServiceservice=Exccutors.newCachedThreadPool();finalSemaphoresp=newSemaphore(3);厕所中坑的个数指定只有3个3个坑,来了5个人,有2个人要等,其中有一个办完事走了,等待的2个哪个先上呢?默认的构造方法不管,谁抢到了谁上。用new

20、Semaphore(3,true)就可以保证先来的先上。将坑的个数设置为1就可以达到互斥效果,每次只能有一个线程运行for(inti=0;i10;i+)来了10个人人的任务抢坑Runnablerunnable=newRunnable()publicvoidrun()sp.acquire();抢坑了会抛中断异常有人占住坑了,给出提示SOP(currentThreadName+进入,当前已有(3-sp.availablePermits())个人了)Thread.sleep(5000)蹲坑办事办完事打声招呼SOP(ThreadName即将离开)释放坑的占有权sp.release();SOP(Thre

21、adName已经走了,还有sp.availablePermits()个坑可用)开始任务吧service.execute(runnable)传统互斥只能内部释放锁this.unlock(),进去this.lock()晕倒了别人就没法进去了;用信号灯可以外部释放,其他线程可以释放再获取sp.release()sp.acquire()。-15.java5的CyclicBarrier同步工具例如:组织人员(线程)郊游,约定一个时间地点(路障),人员陆续到达地点,等所有人员全部到达,开始到公园各玩各的,再到约定时间去食堂吃饭,等所有人到齐开饭java.util.concurrent.CyclicBarr

22、ier一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(commonbarrierpoint)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier。CyclicBarrier支持一个可选的Runnable命令,在一组线程中的最后一个线程到达之后(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。构造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Cyc

23、licBarrier(int) t _blank CyclicBarrier(intparties)创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动barrier时执行预定义的操作。 HYPERLINK /qzone/newblog/v5/editor.html l CyclicBarrier(int, java.lang.Runnable) t _blank CyclicBarrier(intparties,RunnablebarrierAction)创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启

24、动,并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。方法摘要int HYPERLINK /qzone/newblog/v5/editor.html l await() t _blank await()在所有 HYPERLINK /qzone/newblog/v5/editor.html l getParties() t _blank 参与者都已经在此barrier上调用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 参与者都已经在此屏障上调用await方法之前将一直等待,或者超出了指定的等待时间。int HYPERLINK /qzone/newblog/v5/editor.html l getNumberWaiting() t _blank getNumberWaiting()返回当前在屏障处等待的参与者数目。int HYPERLINK /qzone/newblog/v

26、5/editor.html l getParties() t _blank getParties()返回要求启动此barrier的参与者数目。boolean HYPERLINK /qzone/newblog/v5/editor.html l isBroken() t _blank isBroken()查询此屏障是否处于损坏状态。void HYPERLINK /qzone/newblog/v5/editor.html l reset() t _blank reset()将屏障重置为其初始状态。例:ExecutorServiceservice=Executors.newCachedThreadPo

27、ol();finalCyclicBarriercb=newCyclicBarrier(3);约定3个人for(inti=0;i3;i+)产生3个人每个人的任务Runnablerunnable=newRunnable()publicvoidrun()开始出发到目的地Thread.sleep(long)Math.random()*1000);SOP(ThreadName即将到达集合点1,当前已有cb.getNumberWaiting()+1个+(cb.getNumberWaiting()=2?都到齐了,继续走啊:正在等候)cb.await();到了其他人没来就等人到齐了再继续进行Thread.sl

28、eep(long)Math.random()*1000);SOP(ThreadName即将到达集合点2)cb.await();到了其他人没来就等service.execute(runnable);-16.java5的CountDownLatch同步工具好像倒计时计数器,调用CountDownLatch对象的countDown方法就将计数器减1,当到达0时,所有等待者就开始执行。举例:多个运动员等待裁判命令:裁判等所有运动员到齐后发布结果代码示例:ExecutorServiceservice=Executors.newCachedThreadPool();裁判发布命令的计数器,计数器为0,运动员

29、就跑finalCountDownLatchcdOrder=newCountDownLatch(1);运动员跑到终点的计数器,为0裁判宣布结果finalCountDownLatchcdAnswer=newCountDownLatch(3);产生3个运动员for(inti=0;i3;i+)运动员的任务Runnablerunnable=newRunnable()publicvoidrun()SOP(ThreadName准备接受命令)等待发布命令cdOrder.await();计数器为0继续向下执行SOP(ThreadName已接受命令)order计数器为0了Thread.sleep(Random);

30、开始跑步cdAnswer.countDown();跑到终点了,计数器减1;service.execute(runnable);运动员开始任务Thread.sleep(1000)裁判休息一会再发布命令SOP(即将发布命令)cdOrder.countDown();命令计数器置为0,发布命令SOP(命令已经发布,等待结果)cdAnswer.await();等待所有运动员,计数器为0所有运动员到位SOP(宣布结果)java.util.concurrent.CountDownLatch一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。用给定的计数初始化CountDow

31、nLatch。由于调用了countDown()方法,所以在当前计数到达零之前,await方法会一直受阻塞。之后,会释放所有等待的线程,await的所有后续调用都将立即返回。这种现象只出现一次计数无法被重置。如果需要重置计数,请考虑使用CyclicBarrier。CountDownLatch是一个通用同步工具,它有很多用途。将计数1初始化的CountDownLatch用作一个简单的开/关锁存器,或入口:在通过调用countDown()的线程打开入口前,所有调用await的线程都一直在入口处等待。用N初始化的CountDownLatch可以使一个线程在N个线程完成某项操作之前一直等待,或者使其在某

32、项操作完成N次之前一直等待。CountDownLatch的一个有用特性是,它不要求调用countDown方法的线程等到计数到达零时才继续,而在所有线程都能通过之前,它只是阻止任何线程继续通过一个await。构造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l CountDownLatch(int) t _blank CountDownLatch(intcount)构造一个用给定计数初始化的CountDownLatch。方法摘要void HYPERLINK /qzone/newblog/v5/editor.html l await() t _blank

33、 await()使当前线程在锁存器倒计数至零之前一直等待,除非线程被 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)使当前线程在锁存器倒计数至零之前一直等待,除非线程被 HYPERLINK /qzone/newblog/v5/editor.html

34、 l interrupt() t _blank 中断或超出了指定的等待时间。void HYPERLINK /qzone/newblog/v5/editor.html l countDown() t _blank countDown()递减锁存器的计数,如果计数到达零,则释放所有等待的线程。long HYPERLINK /qzone/newblog/v5/editor.html l getCount() t _blank getCount()返回当前计数。String HYPERLINK /qzone/newblog/v5/editor.html l toString() t _blank to

35、String()返回标识此锁存器及其状态的字符串。-17.java5的Exchanger同步工具用于实现两个人之间的数据交换,每个人在完成一定的事务后想与对方交换数据,第一个先拿出数据的人会一直等待第二个人,直到第二个人拿着数据到来时,才能彼此交换数据。举例:毒品交易双方并不是同时到达,有先有后,只有都到达了,瞬间交换数据,各自飞代码演示: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-可以交换的对象类型可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger可能被视为SynchronousQueue的双向形式。Exchanger可能在应用程序(比如遗传算法和管道设计)中很有用。用法示例:以下是重点介绍的一个类,该类使用Exchanger在线程间交换缓冲区,因此,在

38、需要时,填充缓冲区的线程获取一个新腾空的缓冲区,并将填满的缓冲区传递给腾空缓冲区的线程。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();构造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l Exchanger() t _blank Exchanger()创建一个新的Exchanger。方法摘要V HYPERLINK /qzone/newblog/v5/e

41、ditor.html l exchange(V) t _blank exchange(Vx)等待另一个线程到达此交换点(除非当前线程被 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、待另一个线程到达此交换点(除非当前线程被 HYPERLINK /qzone/newblog/v5/editor.html l interrupt() t _blank 中断,或者超出了指定的等待时间),然后将给定的对象传送给该线程,同时接收该线程的对象。-18.java5阻塞队列的应用队列包含固定长度的队列和不固定长度的队列,先进先出固定长度的队列往里放数据,如果放满了还要放,阻塞式队列就会等待,直到有数据取出,空出位置后才继续放;非阻塞式队列不能等待就只能报错了。讲Condition时提到了阻塞队列的原理,Java中已经实现了阻塞队列ArrayBlockingQueueBlockingQue

43、uepublicinterfaceBlockingQueueextendsQueue支持两个附加操作的Queue,这两个操作是:获取元素时等待队列变为非空,以及存储元素时等待空间变得可用。BlockingQueue方法以四种形式出现,对于不能立即满足但可能在将来某一时刻可以满足的操作,这四种形式的处理方式不同:第一种是抛出一个异常,第二种是返回一个特殊值(null或false,具体取决于操作),第三种是在操作可以成功前,无限期地阻塞当前线程,第四种是在放弃前只在给定的最大时间限制内阻塞。下表中总结了这些方法:抛出异常特殊值阻塞超时插入 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元素时,某些实现会抛出NullPointerException。null被用作指示poll操作失败的警戒值。BlockingQueu

47、e可以是限定容量的。它在任意给定时间都可以有一个remainingCapacity,超出此容量,便无法无阻塞地put附加元素。没有任何内部容量约束的BlockingQueue总是报告Integer.MAX_VALUE的剩余容量。BlockingQueue实现主要用于生产者-使用者队列,但它另外还支持Collection接口。因此,举例来说,使用remove(x)从队列中移除任意一个元素是有可能的。然而,这种操作通常不会有效执行,只能有计划地偶尔使用,比如在取消排队信息时。BlockingQueue实现是线程安全的。所有排队方法都可以使用内部锁或其他形式的并发控制来自动达到它们的目的。然而,大量

48、的Collection操作(addAll、containsAll、retainAll和removeAll)没有必要自动执行,除非在实现中特别说明。因此,举例来说,在只添加了c中的一些元素后,addAll(c)有可能失败(抛出一个异常)。java.util.concurrent.ArrayBlockingQueueE-在此collection中保持的元素类型extendsAbstractQueueimplementsBlockingQueue,Serializable一个由数组支持的有界阻塞队列。此队列按FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中存在时间最长的元素。队列的尾部是

49、在队列中存在时间最短的元素。新元素插入到队列的尾部,队列获取操作则是从队列头部开始获得元素。这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性(fairness)设置为true而构造的队列允许按照FIFO顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。此类及其迭代器实现了Collection和It

50、erator接口的所有可选方法。此类是JavaCollectionsFramework的成员。构造方法摘要 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int) t _blank ArrayBlockingQueue(intcapacity)创建一个带有给定的(固定)容量和默认访问策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean) t _blank ArrayBlocking

51、Queue(intcapacity,booleanfair)创建一个具有给定的(固定)容量和指定访问策略的ArrayBlockingQueue。 HYPERLINK /qzone/newblog/v5/editor.html l ArrayBlockingQueue(int, boolean, java.util.Collection) t _blank ArrayBlockingQueue(intcapacity,booleanfair,Collectionc)创建一个具有给定的(固定)容量和指定访问策略的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)最多从此队列中移除给定数量的可用元素,并将这些元素添加到给定collection中。Iterator HYPERLINK /qzone/newblog/v5/editor.html l iterator() t _blank iterator()返回在此队列中的元素上按适当顺序进行迭代的迭代器。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)将指定的元素插入此队列的尾部,如果该队列已满,则在到达指定的等待时间之前等待可用的空间。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()返回在无阻塞的理想情况下(不存在内存或资源约束)此队列能接受的其他元素数量。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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论