CyclicBarrier把所有的线程都阻塞在一个阀门位置cyclicbarrier.awaite(),然后等到等待的线程数到达预设的值,就打开这个阀门。记得是阻塞线程,不是阻塞操作,在同一个线程使劲掉await是没什么效果的。
public class CyclicBarrierTest{
private final int STUDENT_COUNT = 10;
private final CyclicBarrier cb = new CyclicBarrier(STUDENT_COUNT, new Runnable() {
@Override
public void run() {
System.out.println("人到齐了,开门....");
}
});
public void goHome() throws InterruptedException, BrokenBarrierException{
System.out.println(Thread.currentThread().getName()+"已刷卡,等待开门回家~");
cb.await();
System.out.println(Thread.currentThread().getName() + "放学回家~");
}
public static void main(String[] args) {
CyclicBarrierTest ct = new CyclicBarrierTest();
for(int i =0;i<ct.STUDENT_COUNT;i++){
new Thread("学生"+i+" "){
@Override
public void run() {
try {
ct.goHome();
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}.start();
}
}
}
package com.zhy.concurrency.cyclic;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
/**
* 改造后的门禁系统
*
* @author zhy
*
*/
public class CyclicBarrierTest23
{
/**
* 学生总数
*/
private final int STUDENT_COUNT = 12;
/**
* 每3个人一组出门
*/
final CyclicBarrier barrier = new CyclicBarrier(2,
new Runnable()
{
@Override
public void run()
{
System.out.println("有2个学生到齐了,放行....");
}
});
public void goHome() throws InterruptedException, BrokenBarrierException
{
System.out.println(Thread.currentThread().getName() + "已刷卡,等待开门回家~");
barrier.await();
}
public static void main(String[] args) throws InterruptedException,
BrokenBarrierException
{
final CyclicBarrierTest23 instance = new CyclicBarrierTest23();
/**
* 每个线程代表一个学生
*/
for (int i = 0; i < instance.STUDENT_COUNT; i++)
{
new Thread("学生" + i +" " )
{
public void run()
{
try
{ Thread.sleep(1000);
instance.goHome();
} catch (InterruptedException e)
{
e.printStackTrace();
} catch (BrokenBarrierException e)
{
e.printStackTrace();
}
};
}.start();
}
}
}