51,411
社区成员
发帖
与我相关
我的任务
分享
import java.util.concurrent.TimeUnit;
public class MyCycliBarrier {
public volatile int count;
public Runnable endWait;
public volatile int realCount;
public MyCycliBarrier(int size,Runnable runnable)
{
this.count = size;
this.realCount = size;
this.endWait = runnable;
CheckAndRelease<MyCycliBarrier> checkAndRelease = new CheckAndRelease<MyCycliBarrier>(this);
new Thread(checkAndRelease).start();
}
public synchronized void await() {
try {
count--;
while(count!=realCount) {
wait();
}
} catch (InterruptedException e) {
Print.p("myCyclicBarrier interrupted");
}
}
public static void main(String[] args)
{
MyCycliBarrier cycliBarrier = new MyCycliBarrier(5, new Runnable() {
@Override
public void run() {
System.out.println("CycliBarrier Over");
}
});
for(int i=0;i<5;i++)
{
new Thread(new MyStringProducer(cycliBarrier)).start();
}
}
}
class MyStringProducer implements Runnable{
MyCycliBarrier myCycliBarrier;
public MyStringProducer( MyCycliBarrier m)
{
this.myCycliBarrier = m;
}
@Override
public void run() {
for(int i=0;i<5;i++)
{
System.out.println(Thread.currentThread()+" "+i);
myCycliBarrier.await();
}
}
}
class CheckAndRelease<T extends MyCycliBarrier> implements Runnable
{
T t;
public CheckAndRelease(T a)
{
this.t = a;
}
@Override
public void run() {
while(!Thread.interrupted())
{
if(t.count==0)
{
synchronized (t)
{
t.count = t.realCount;
new Thread(t.endWait).start();
try {
TimeUnit.NANOSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
t.notifyAll();
}
}
}
}
}