CyclicBarrier使用详解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
CyclicBarrier使⽤详解
1. CyclicBarrier 是什么?
从字⾯上的意思可以知道,这个类的中⽂意思是“循环栅栏”。
⼤概的意思就是⼀个可循环利⽤的屏障。
它的作⽤就是会让所有线程都等待完成后才会继续下⼀步⾏动。
举个例⼦,就像⽣活中我们会约朋友们到某个餐厅⼀起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有⼈到齐之后才会让我们进去。
这⾥的朋友们就是各个线程,餐厅就是 CyclicBarrier。
2. 怎么使⽤ CyclicBarrier
2.1 构造⽅法
public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
解析:
parties 是参与线程的个数
第⼆个构造⽅法有⼀个 Runnable 参数,这个参数的意思是最后⼀个到达线程要做的任务
2.2 重要⽅法
public int await() throws InterruptedException, BrokenBarrierException
public int await(long timeout, TimeUnit unit) throws InterruptedException, BrokenBarrierException, TimeoutException
解析:
线程调⽤ await() 表⽰⾃⼰已经到达栅栏
BrokenBarrierException 表⽰栅栏已经被破坏,破坏的原因可能是其中⼀个线程 await() 时被中断或者超时
2.3 基本使⽤
2.3.1 需求
⼀个线程组的线程需要等待所有线程完成任务后再继续执⾏下⼀次任务
2.3.2 代码实现
public class CyclicBarrierDemo {
static class TaskThread extends Thread {
CyclicBarrier barrier;
public TaskThread(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.println(getName() + " 到达栅栏 A");
barrier.await();
System.out.println(getName() + " 冲破栅栏 A");
Thread.sleep(2000);
System.out.println(getName() + " 到达栅栏 B");
barrier.await();
System.out.println(getName() + " 冲破栅栏 B");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
int threadNum = 5;
CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 完成最后任务");
}
});
for(int i = 0; i < threadNum; i++) {
new TaskThread(barrier).start();
}
}
}
打印结果:
Thread-1 到达栅栏 A
Thread-3 到达栅栏 A
Thread-0 到达栅栏 A
Thread-4 到达栅栏 A
Thread-2 到达栅栏 A
Thread-2 完成最后任务
Thread-2 冲破栅栏 A
Thread-1 冲破栅栏 A
Thread-3 冲破栅栏 A
Thread-4 冲破栅栏 A
Thread-0 冲破栅栏 A
Thread-4 到达栅栏 B
Thread-0 到达栅栏 B
Thread-3 到达栅栏 B
Thread-2 到达栅栏 B
Thread-1 到达栅栏 B
Thread-1 完成最后任务
Thread-1 冲破栅栏 B
Thread-0 冲破栅栏 B
Thread-4 冲破栅栏 B
Thread-2 冲破栅栏 B
Thread-3 冲破栅栏 B
从打印结果可以看出,所有线程会等待全部线程到达栅栏之后才会继续执⾏,并且最后到达的线程会完成 Runnable 的任务。
3. CyclicBarrier 使⽤场景
可以⽤于多线程计算数据,最后合并计算结果的场景。
4. CyclicBarrier 与 CountDownLatch 区别
CountDownLatch 是⼀次性的,CyclicBarrier 是可循环利⽤的
CountDownLatch 参与的线程的职责是不⼀样的,有的在倒计时,有的在等待倒计时结束。
CyclicBarrier 参与的线程职责是⼀样的。
参考⽂章:。