CyclicBarrier 这个东西到达一定程度后,同时唤醒某个值, 里面有个lock,同时有个condition,condition,设置一个初始值数量
int threadNum = 5;
CyclicBarrier barrier = new CyclicBarrier(threadNum, new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + " 完成最后任务");
}
});
设置完毕后,每次调用await()方法之前,就会将值减1,如果大于0,就会让步(await方法),等待其他线程唤醒。唤醒后自动重置为最初的值,进入下一个轮回。
里面字段
generation(broken字段检查是否被意外打破)
count 数量字段,初始化使用)
trip,condition
lock 锁,保证原子性递减。
demo
package com.cs.demo;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierDemo {
static class TaskThread extends Thread {
CyclicBarrier barrier;
long time;
public TaskThread(CyclicBarrier barrier,long time) {
this.barrier = barrier;
this.time = time;
}
@Override
public void run() {
try {
Thread.sleep(time);
System.out.println(getName() + " 到达栅栏 A");
barrier.await();
System.out.println(getName() + " 冲破栅栏 A");
Thread.sleep(time * 2L);
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, 1000 * i).start();
}
}
}
运行结果
Thread-0 到达栅栏 A
Thread-1 到达栅栏 A
Thread-2 到达栅栏 A
Thread-3 到达栅栏 A
Thread-4 到达栅栏 A
Thread-4 完成最后任务
Thread-4 冲破栅栏 A
Thread-0 冲破栅栏 A
Thread-2 冲破栅栏 A
Thread-1 冲破栅栏 A
Thread-3 冲破栅栏 A
Thread-0 到达栅栏 B
Thread-1 到达栅栏 B
Thread-2 到达栅栏 B
Thread-3 到达栅栏 B
Thread-4 到达栅栏 B
Thread-4 完成最后任务
Thread-4 冲破栅栏 B
Thread-0 冲破栅栏 B
Thread-1 冲破栅栏 B
Thread-3 冲破栅栏 B
Thread-2 冲破栅栏 B
本文详细介绍了Java并发工具类CyclicBarrier的原理与使用,通过实例展示了如何设置和使用CyclicBarrier来同步多个线程操作。在示例中,线程在到达栅栏点后进行等待,直到所有线程到达后一起继续执行,体现了CyclicBarrier的协调多线程行为。此外,还解释了其内部的generation和condition字段以及lock机制,帮助理解其工作原理。

491

被折叠的 条评论
为什么被折叠?



