欢迎来到天天文库
浏览记录
ID:37915738
大小:48.50 KB
页数:6页
时间:2019-06-02
《CyclicBarrier》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、CyclicBarrier 2010-09-3015:01:50
2、 分类: JAVA线程安全
3、字号 订阅java.util.concurrent.CyclicBarrier是一个同步辅助类,它允许一组线程互相等待,直到所有到达,然后他们才可以跨越屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。CyclicBarr
4、ier 支持一个可选的Runnable对象参数,在一组线程中的最后一个线程到达之后执行它(但在释放所有线程之前),该命令只在每个屏障点运行一次。若在继续所有参与线程之前更新共享状态,此屏障操作很有用。 注意1:CyclicBarrier支持一个可选的Runnable,在一组线程中的最后一个线程到达之后(但在释放所有线程之前)执行Runnable示例用法:下面是一个在并行分解设计中使用 barrier 的例子: classSolver{ finalintN; finalfloat[][]data; fin
5、alCyclicBarrierbarrier; classWorkerimplementsRunnable{ intmyRow; Worker(introw){myRow=row;} publicvoidrun(){ while(!done()){ processRow(myRow); try{ barrier.await(); }catch(InterruptedExceptionex){ return; }catch(BrokenBa
6、rrierExceptionex){ return; } } } } publicSolver(float[][]matrix){ data=matrix; N=matrix.length; barrier=newCyclicBarrier(N, newRunnable(){ publicvoidrun(){ mergeRows(...);
7、 } }); for(inti=0;i8、:这个例子感觉不怎么好。done()和waitUntilDone()对阅读代码干扰很大。 如果屏障操作在执行时不依赖于正挂起的线程,则线程组中的任何线程在获得释放时都能执行该操作。为方便此操作,每次调用 await() 都将返回能到达屏障处的线程的序列号。然后,您可以选择哪个线程应该执行屏障操作,例如:if(barrier.await()==0){ //logthecompletionofthisiteration } 注意:barrier.await() == barrier.getParties(9、) - 1 表示是第一个到达的线程,barrier.await() == 0表示这是最后一个到达的线程,当然此时它已经跨过了屏障。 至于线程是第几个跨越障碍的线程,这个不清楚,应该和线程的调度有关。 可以参照实例1。 对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则10、用 InterruptedException)以反常的方式离开。注意:如果因为中断、失败或者超时等原因,导致线程跨过了屏障点,那么其他线程将过BrokenBarrierException的方式跨过。(如果它们几乎同时被中断,则用 InterruptedException)Memoryconsistencyeffects:Actionsinathreadpriortocalling await() h
8、:这个例子感觉不怎么好。done()和waitUntilDone()对阅读代码干扰很大。 如果屏障操作在执行时不依赖于正挂起的线程,则线程组中的任何线程在获得释放时都能执行该操作。为方便此操作,每次调用 await() 都将返回能到达屏障处的线程的序列号。然后,您可以选择哪个线程应该执行屏障操作,例如:if(barrier.await()==0){ //logthecompletionofthisiteration } 注意:barrier.await() == barrier.getParties(
9、) - 1 表示是第一个到达的线程,barrier.await() == 0表示这是最后一个到达的线程,当然此时它已经跨过了屏障。 至于线程是第几个跨越障碍的线程,这个不清楚,应该和线程的调度有关。 可以参照实例1。 对于失败的同步尝试,CyclicBarrier 使用了一种要么全部要么全不 (all-or-none) 的破坏模式:如果因为中断、失败或者超时等原因,导致线程过早地离开了屏障点,那么在该屏障点等待的其他所有线程也将通过 BrokenBarrierException(如果它们几乎同时被中断,则
10、用 InterruptedException)以反常的方式离开。注意:如果因为中断、失败或者超时等原因,导致线程跨过了屏障点,那么其他线程将过BrokenBarrierException的方式跨过。(如果它们几乎同时被中断,则用 InterruptedException)Memoryconsistencyeffects:Actionsinathreadpriortocalling await() h
此文档下载收益归作者所有