没有合适的资源?快使用搜索试试~ 我知道了~
并发工具类及线程池1
需积分: 0 0 下载量 98 浏览量
2022-08-03
14:16:39
上传
评论
收藏 1.26MB PDF 举报
温馨提示
试读
26页
1、简介2、运行机制二、CyclicBarrier结构图CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。Cy
资源详情
资源评论
资源推荐
并发工具类及线程池
一、CyclicBarrier简介
1、简介
2、运行机制
二、CyclicBarrier结构图
CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。
CyclicBarrier(循环屏障) 直译为可循环使用(Cyclic)的屏障(Barrier)。它可以让一组线程到达
一个屏障(同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继
续工作。
JDK中的描述:
A synchronization aid that allows a set of threads to all wait for each other to
reach a common barrier point.
CyclicBarriers are useful in programs involving a fixed sized party of threads
that must occasionally wait for each other.
The barrier is called cyclic because it can be re-used after the waiting threads
are released.
CyclicBarrier是一个同步辅助类,它允许一组线程相互等待直到所有线程都到达一个公共的屏障点。
在程序中有固定数量的线程,这些线程有时候必须等待彼此,这种情况下,使用CyclicBarrier很有帮助。
这个屏障之所以用循环修饰,是因为在所有的线程释放彼此之后,这个屏障是可以重新使用的。
三、CyclicBarrier方法说明
1、CyclicBarrier(parties)
2、CyclicBarrier(parties,Runnable barrierAction)
3、getParties()
4、getNumberWaiting()
5、await()
初始化相互等待的线程数量的构造方法
初始化相互等待的线程数量的构造方法以及屏障线程的构造方法
屏障线程的运行时机:等待的线程数量 = parties,CyclicBarrier打开屏障之前
举例:在分组计算中,每个线程负责一部分计算,最终这些线程计算结束之后,交由屏障线程进行汇总计算
获取CyclicBarrier打开屏障的线程数量,也成为方数
获取真在CyclicBarrier上等待的线程数量
6、await(timeout,TimeUnit)
7、isBroken
8、reset
四、源码分析
首先看一下CyclicBarrier内部声明的一些属性
在CyclicBarrier上进行阻塞等待,直到发生以下情形之一:
a.在CyclicBarrier上等待的线程数量达到parties,则所有线程被释放,继续执行。
b.当前线程被中断,则抛出InterruptedException异常,并停止等待,继续执行。
c.其他等待的线程被中断,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
d.其他等待的线程超时,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
e.其他线程调用CyclicBarrier.reset()方法,则当前线程抛出BrokenBarrierException异常,并停
止等待,继续执行。
在CyclicBarrier上进行限时的阻塞等待,直到发生以下情形之一:
a.在CyclicBarrier上等待的线程数量达到parties,则所有线程被释放,继续执行。
b.当前线程被中断,则抛出InterruptedException异常,并停止等待,继续执行。
c.当前线程等待超时,则抛出TimeoutException异常,并停止等待,继续执行。
d.其他等待的线程被中断,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
e.其他等待的线程超时,则当前线程抛出BrokenBarrierException异常,并停止等待,继续执行。
f.其他线程调用CyclicBarrier.reset()方法,则当前线程抛出BrokenBarrierException异常,并停
止等待,继续执行。
获取是否破损标志位broken的值,此值有以下几种情况:
a.CyclicBarrier初始化时,broken=false,表示屏障未破损。
b.如果正在等待的线程被中断,则broken=true,表示屏障破损。
c.如果正在等待的线程超时,则broken=true,表示屏障破损。
d.如果有线程调用CyclicBarrier.reset()方法,则broken=false,表示屏障回到未破损状态。
使得CyclicBarrier回归初始状态,直观来看它做了两件事:
a.如果有正在等待的线程,则会抛出BrokenBarrierException异常,且这些线程停止等待,继续执行。
b.将是否破损标志位broken置为false。
/**用于保护屏障入口的锁*/
private final ReentrantLock lock = new ReentrantLock();
/**线程等待条件 */
private final Condition trip = lock.newCondition();
/** 记录等待的线程数 */
private final int parties;
/**所有线程到达屏障点后,首先执行的命令 */
private final Runnable barrierCommand;
private Generation generation = new Generation();
/**实际中仍在等待的线程数,每当有一个线程到达屏障点,count值就会减一;当一次新的运算开始后,
count的值被重置为parties*/
private int count;
其中,Generation是CyclicBarrier的一个静态内部类,它只有一个boolean类型的属性,具体代码如
下:
当使用构造方法创建CyclicBarrier实例的时候,就是给上面这些属性赋值
CyclicBarrier.await方法调用CyclicBarrier.dowait(),每次调用await()都会使计数器-1,当减少到0
时就会唤醒所有的线程 ,当调用await()方法时,当前线程已经到达屏障点,当前线程阻塞进入休眠状
态。
当前线程已经到达屏障点,当前线程阻塞进入休眠状态
dowait()方法
private static class Generation {
Generation() {} // prevent access constructor creation
boolean broken; // initially false
}
//创建一个CyclicBarrier实例,parties指定参与相互等待的线程数,
//barrierAction指定当所有线程到达屏障点之后,首先执行的操作,该操作由最后一个进入屏障点的线程
执行。
public CyclicBarrier(int parties, Runnable barrierAction) {
if (parties <= 0) throw new IllegalArgumentException();
this.parties = parties;
this.count = parties;
this.barrierCommand = barrierAction;
}
//创建一个CyclicBarrier实例,parties指定参与相互等待的线程数
public CyclicBarrier(int parties) {
this(parties, null);
}
//该方法被调用时表示当前线程已经到达屏障点,当前线程阻塞进入休眠状态
//直到所有线程都到达屏障点,当前线程才会被唤醒
public int await() throws InterruptedException, BrokenBarrierException {
try {
return dowait(false, 0L);
} catch (TimeoutException toe) {
throw new Error(toe); // cannot happen
}
}
//该方法被调用时表示当前线程已经到达屏障点,当前线程阻塞进入休眠状态
//在timeout指定的超时时间内,等待其他参与线程到达屏障点
//如果超出指定的等待时间,则抛出TimeoutException异常,如果该时间小于等于零,则此方法根本不会
等待
public int await(long timeout, TimeUnit unit)
throws InterruptedException,
BrokenBarrierException,
TimeoutException {
return dowait(true, unit.toNanos(timeout));
}
private int dowait(boolean timed, long nanos)
剩余25页未读,继续阅读
柏傅美
- 粉丝: 18
- 资源: 325
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0