




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CyclicBarrier2010-09-30 15:01:50|分类:JAVA线程安全|字号订阅java.util.concurrent.CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有到达,然后他们才可以跨越屏障点(commonbarrierpoint)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时CyclicBarrier很有用。因为该barrier在释放等待线程后可以重用,所以称它为循环的barrier。CyclicBarrier支持一个可选的Runnable 对象参数,在一组线程中的最后一个线程到达之后执行它(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。注意1:CyclicBarrier支持一个可选的Runnable,在一组线程中的最后一个线程到达之后(但在释放所有线程之前)执行Runnable示例用法:下面是一个在并行分解设计中使用barrier的例子:class Solver final int N; final float data; final CyclicBarrier barrier; class Worker implements Runnable int myRow; Worker(int row) myRow = row; public void run() while (!done() processRow(myRow); try barrier.await(); catch (InterruptedException ex) return; catch (BrokenBarrierException ex) return; public Solver(float matrix) data = matrix; N = matrix.length; barrier = new CyclicBarrier(N, new Runnable() public void run() mergeRows(.); ); for (int i = 0; i N; +i) new Thread(new Worker(i).start(); waitUntilDone(); 在这个例子中,每个worker线程处理矩阵的一行,在处理完所有的行之前,该线程将一直在屏障处等待。处理完所有的行之后,将执行所提供的Runnable屏障操作,并合并这些行。如果合并者确定已经找到了一个解决方案,那么done()将返回true,所有的worker线程都将终止。注意1:这个例子感觉不怎么好。done()和waitUntilDone()对阅读代码干扰很大。如果屏障操作在执行时不依赖于正挂起的线程,则线程组中的任何线程在获得释放时都能执行该操作。为方便此操作,每次调用await()都将返回能到达屏障处的线程的序列号。然后,您可以选择哪个线程应该执行屏障操作,例如:if (barrier.await() = 0) / log the completion of this iteration 注意:barrier.await()=barrier.getParties()-1表示是第一个到达的线程,barrier.await()=0表示这是最后一个到达的线程,当然此时它已经跨过了屏障。至于线程是第几个跨越障碍的线程,这个不清楚,应该和线程的调度有关。可以参照实例1。对于失败的同步尝试,CyclicBarrier使用了一种要么全部要么全不(all-or-none)的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过BrokenBarrierException(如果它们几乎同时被中断,则用InterruptedException)以反常的方式离开。注意:如果因为中断、失败或者超时等原因,导致线程跨过了屏障点,那么其他线程将过BrokenBarrierException的方式跨过。(如果它们几乎同时被中断,则用InterruptedException)Memory consistency effects: Actions in a thread prior to callingawait()happen-beforeactions that are part of the barrier action, which in turnhappen-beforeactions following a successful return from the correspondingawait()in other threads.await()一定比在它之前的代码后执行,await()一定比它之后的代码先被执行;await()之前的代码一定比Runnable barrierAction先被执行,Runnable barrierAction一定比await()之后的代码先被执行主要方法publicCyclicBarrier(intparties,RunnablebarrierAction)创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。参数:parties-在启动barrier前必须调用await()的线程数barrierAction-在启动barrier时执行的命令;如果不执行任何操作,则该参数为null抛出:IllegalArgumentException-如果parties小于1publicCyclicBarrier(intparties,RunnablebarrierAction)创建一个新的CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,并在启动barrier时执行给定的屏障操作,该操作由最后一个进入barrier的线程执行。参数:parties-在启动barrier前必须调用await()的线程数barrierAction-在启动barrier时执行的命令;如果不执行任何操作,则该参数为null抛出:IllegalArgumentException-如果parties小于1publicintgetParties()返回要求启动此barrier的参与者数目。返回:要求启动此barrier的参与者数目publicintawait()throwsInterruptedException,BrokenBarrierException在所有参与者都已经在此barrier上调用await方法之前,将一直等待。如果当前线程不是将到达的最后一个线程,出于调度目的,将禁用它,且在发生以下情况之一前,该线程将一直处于休眠状态:*最后一个线程到达;或者*其他某个线程中断当前线程;或者*其他某个线程中断另一个等待线程;或者*其他某个线程在等待barrier时超时;或者*其他某个线程在此barrier上调用reset()。如果当前线程:*在进入此方法时已经设置了该线程的中断状态;或者*在等待时被中断则抛出InterruptedException,并且清除当前线程的已中断状态。如果在线程处于等待状态时barrier被reset(),或者在调用await时barrier被损坏,抑或任意一个线程正处于等待状态,则抛出BrokenBarrierException异常。如果任何线程在等待时被中断,则其他所有等待线程都将抛出BrokenBarrierException异常,并将barrier置于损坏状态。如果当前线程是最后一个将要到达的线程,并且构造方法中提供了一个非空的屏障操作,则在允许其他线程继续运行之前,当前线程将运行该操作。如果在执行屏障操作过程中发生异常,则该异常将传播到当前线程中,并将barrier置于损坏状态。返回:到达的当前线程的序列号,其中,getParties()-1指示将到达的第一个线程,零指示最后一个到达的线程抛出:InterruptedException-如果当前线程在等待时被中断BrokenBarrierException-如果另一个线程在当前线程等待时被中断或超时,或者重置了barrier,或者在调用await时barrier被损坏,抑或由于异常而导致屏障操作(如果存在)失败。注意1:返回是到达的当前线程的序列号,但是本质表示在当前线程到达时,还需要await几个线程。barrier.await()=barrier.getParties()-1表示是第一个到达的线程,barrier.await()=0表示这是最后一个到达的线程,当然此时它已经跨过了屏障。至于线程是第几个跨越障碍的线程,这个不清楚,应该和线程的调度有关。注意2:如果当前线程不是将到达的最后一个线程,出于调度目的,将禁用它。这里的禁用应该是指不分配时间片段给它吧。publicintawait(longtimeout,TimeUnitunit)throwsInterruptedException,BrokenBarrierException,TimeoutException在所有参与者都已经在此屏障上调用await方法之前将一直等待,或者超出了指定的等待时间。如果当前线程不是将到达的最后一个线程,出于调度目的,将禁用它,且在发生以下情况之一前,该线程将一直处于休眠状态:*最后一个线程到达;或者*超出指定的超时时间;或者*其他某个线程中断当前线程;或者*其他某个线程中断另一个等待线程;或者*其他某个线程在等待barrier时超时;或者*其他某个线程在此barrier上调用reset()。如果当前线程:*在进入此方法时已经设置了该线程的中断状态;或者*在等待时被中断则抛出InterruptedException,并且清除当前线程的已中断状态。如果超出指定的等待时间,则抛出TimeoutException异常。如果该时间小于等于零,则此方法根本不会等待。如果在线程处于等待状态时barrier被reset(),或者在调用await时barrier被损坏,抑或任意一个线程正处于等待状态,则抛出BrokenBarrierException异常。如果任何线程在等待时被中断,则其他所有等待线程都将抛出BrokenBarrierException,并将屏障置于损坏状态。如果当前线程是最后一个将要到达的线程,并且构造方法中提供了一个非空的屏障操作,则在允许其他线程继续运行之前,当前线程将运行该操作。如果在执行屏障操作过程中发生异常,则该异常将传播到当前线程中,并将barrier置于损坏状态。参数:timeout-等待barrier的时间unit-超时参数的时间单位返回:到达的当前线程的索引,其中,索引getParties()-1指示第一个将要到达的线程,零指示最后一个到达的线程抛出:InterruptedException-如果当前线程在等待时被中断TimeoutException-如果超出了指定的超时时间BrokenBarrierException-如果另一个线程在当前线程等待时被中断或超时,或者重置了barrier,或者调用await时barrier被损坏,抑或由于异常而导致屏障操作(如果存在)失败。publicbooleanisBroken()查询此屏障是否处于损坏状态。返回:如果因为构造或最后一次重置而导致中断或超时,从而使一个或多个参与者摆脱此barrier,或者因为异常而导致某个屏障操作失败,则返回true;否则返回false。publicvoidreset()将屏障重置为其初始状态。如果所有参与者目前都在屏障处等待,则它们将返回,同时抛出一个BrokenBarrierException。注意,在由于其他原因造成损坏之后,实行重置可能会变得很复杂;此时需要使用其他方式重新同步线程,并选择其中一个线程来执行重置。与为后续使用创建一个新barrier相比,这种方法可能更好一些。publicintgetNumberWaiting()返回当前在屏障处等待的参与者数目。此方法主要用于调试和断言。返回:当前阻塞在await()中的参与者数目。实例1importjava.util.concurrent.BrokenBarrierException;importjava.util.concurrent.CyclicBarrier;publicclassCyclicBarrierDemoCyclicBarrierDemo()intnumber=5;CyclicBarrierbarrier=newCyclicBarrier(number);tryfor(inti=0;inumber;i+)newCyclicBarrierDemoThread(thread+i,barrier).start();Thread.sleep(100);catch(InterruptedExceptione)e.print
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 难点解析江苏省昆山市七年级上册整式及其加减专题攻克练习题(含答案详解)
- 大学新生入学的发言稿
- 声母教学反思
- 小儿清肺课件
- 别墅餐厅出租合同协议书
- 实验室2024年管理评审资料完整版(含内审报告)符合新版《评审准则》
- 农村合作社合同协议范本
- 出海租船合同协议书范本
- 个人定金合同协议书范本
- 隧道劳务个人分包合同范本
- 空调器设定温度与耗电量关系
- quite imposing plus 3 0中文破解拼版插件内含安装说明qi教程
- (新)部编人教版高中历史中外历史纲要上册《第13课-从明朝建立到清军入关课件》讲解教学课件
- 《医院感染管理办法》知识试题与答案
- 提高管床护士对患者诊疗信息的知晓度PDCA记录表
- 某园区综合运营平台项目建议书
- 孕期患者非产科手术的麻醉
- 养老机构临终关怀服务手册
- 母婴产品抖音运营方案
- GB/T 27007-2011合格评定合格评定用规范性文件的编写指南
- GB/T 23445-2009聚合物水泥防水涂料
评论
0/150
提交评论