CyclicBarrier
CyclicBarrier 就像它的解释一样,可以看成是个障碍,所有的线程必须到期后才能一起通过这个障碍。
常用方法
- CyclicBarrier(int parties) 初始化时规定一个数目,然后计算调用了 await() 进入等待的线程数。当线程数达到了这个数目时,所有进入等待状态的线程都被唤醒并继续。
- CyclicBarrier(int parties, Runnable barrierAction) 初始化时带入一个Runnable的参数,此Runnable任务在CyclicBarrier的数目达到后,所有其他线程被唤醒前执行。
- await() 休眠等待。 等待所有人到达。
CyclicBarrier(int parties) 使用
package cn.lvhaosir;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class Write implements Runnable {
CyclicBarrier cyclicBarrier;
String name;
public Write(CyclicBarrier cyclicBarrier,String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
@Override
public void run() {
try {
System.out.println(name+"学生到达教师...等待考试");
// 等待班上的学生到到期
cyclicBarrier.await();
// 开始考试,每个人做题时间不同
System.out.println(name+"学生正在做题...");
Thread.sleep(new Random().nextInt(1000));
// 这次考试,需等待所有同学都写完才交卷
System.out.println(name+"学生,题目已经写完...等待其他同学");
// 等待同学们都做完然后交卷
cyclicBarrier.await();
System.out.println(name+"学生交卷...");
} catch (InterruptedException e1) {
e1.printStackTrace();
} catch (BrokenBarrierException e1) {
e1.printStackTrace();
}
};
}
public class Test003 {
public static void main(String[] args) {
// 创建全班人数 5 人
CyclicBarrier cyclicBarrier = new CyclicBarrier(5);
for (int i = 1; i <= 5; i++) {
// 创建同学
new Thread(new Write(cyclicBarrier,"学生"+i)).start();
}
}
}
/**
学生2学生到达教师...等待考试
学生4学生到达教师...等待考试
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生3学生到达教师...等待考试
学生3学生正在做题...
学生2学生正在做题...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
学生1学生交卷...
学生3学生交卷...
学生5学生交卷...
学生2学生交卷...
学生4学生交卷...
*/
CyclicBarrier(int parties, Runnable barrierAction) 使用
package cn.lvhaosir;
import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
class Write1 implements Runnable {
CyclicBarrier cyclicBarrier;
String name;
public Write1(CyclicBarrier cyclicBarrier,String name) {
this.cyclicBarrier = cyclicBarrier;
this.name = name;
}
public Write1(String name) {
super();
this.name = name;
}
@Override
public void run() {
try {
System.out.println(name+"学生到达教师...等待考试");
// 等待班上的学生到到期
cyclicBarrier.await();
// 开始考试,每个人做题时间不同
System.out.println(name+"学生正在做题...");
Thread.sleep(new Random().nextInt(1000));
// 这次考试,需等待所有同学都写完才交卷
System.out.println(name+"学生,题目已经写完...等待其他同学");
// 等待同学们都做完然后交卷
cyclicBarrier.await();
System.out.println(name+"学生交卷...");
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (BrokenBarrierException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
};
}
class Read1 implements Runnable {
@Override
public void run() {
System.out.println("所有人都同步了,检查一下信息...");
}
}
public class CopyOfTest003 {
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(5,new Read1());
for (int i = 1; i <= 5; i++) {
new Thread(new Write1(cyclicBarrier,"学生"+i)).start();
}
}
}
/** 结果:
学生1学生到达教师...等待考试
学生5学生到达教师...等待考试
学生4学生到达教师...等待考试
学生3学生到达教师...等待考试
学生2学生到达教师...等待考试
所有人都同步了,检查一下信息...
学生4学生正在做题...
学生1学生正在做题...
学生5学生正在做题...
学生3学生正在做题...
学生2学生正在做题...
学生3学生,题目已经写完...等待其他同学
学生4学生,题目已经写完...等待其他同学
学生5学生,题目已经写完...等待其他同学
学生2学生,题目已经写完...等待其他同学
学生1学生,题目已经写完...等待其他同学
所有人都同步了,检查一下信息...
学生1学生交卷...
学生3学生交卷...
学生4学生交卷...
学生5学生交卷...
学生2学生交卷...
*/