在 Java 中,可以使用 wait
和 notify
方法来实现类似 CyclicBarrier
的同步机制。以下是使用 wait
和 notify
方法实现自定义 CyclicBarrier
的一个简单示例:
public class MyCyclicBarrier {
private final int count;
private int waiting = 0;
private boolean isCompleted = false;
public MyCyclicBarrier(int count) {
if (count <= 0) {
throw new IllegalArgumentException("Count must be greater than 0");
}
this.count = count;
}
public synchronized void await() throws InterruptedException {
waiting++;
if (waiting == count) {
isCompleted = true;
notifyAll(); // 唤醒所有等待的线程
waiting = 0; // 重置等待计数
} else {
while (!isCompleted) {
wait(); // 等待直到其他线程调用 notify 或 notifyAll
}
}
}
public synchronized void reset() {
isCompleted = false;
waiting = 0;
}
public static void main(String[] args) throws InterruptedException {
final MyCyclicBarrier barrier = new MyCyclicBarrier(3);
Thread thread1 = new Thread(() -> {
try {
System.out.println("Thread 1 is waiting at the barrier.");
barrier.await();
System.out.println("Thread 1 continues after barrier.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread thread2 = new Thread(() -> {
try {
System.out.println("Thread 2 is waiting at the barrier.");
barrier.await();
System.out.println("Thread 2 continues after barrier.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread thread3 = new Thread(() -> {
try {
System.out.println("Thread 3 is waiting at the barrier.");
barrier.await();
System.out.println("Thread 3 continues after barrier.");
} catch (InterruptedException e) {
e.printStackTrace();
}
});
thread1.start();
thread2.start();
thread3.start();
}
}
在这个示例中,MyCyclicBarrier
类使用一个 count
变量来记录需要等待的线程数量。waiting
变量用来记录当前已经到达屏障的线程数量。isCompleted
标志用来指示是否所有线程都已经到达屏障。
await
方法首先增加 waiting
计数,然后检查是否所有线程都已到达。如果是,它会通过调用 notifyAll
唤醒所有等待的线程,并将 isCompleted
设置为 true
。如果还没有所有线程到达,当前线程将通过调用 wait
方法进入等待状态,直到 isCompleted
变为 true
。
reset
方法可以用来重置屏障状态,以便可以重复使用。
在 main
方法中,我们创建了一个 MyCyclicBarrier
实例并启动了三个线程。每个线程在执行时都会调用 await
方法,等待其他线程到达屏障,然后继续执行。
请注意,这个自定义的 CyclicBarrier
实现是简化的,并没有处理像 BrokenBarrierException
这样的异常情况,也没有提供 barrierAction
这样的回调机制。在实际应用中,你可能需要添加更多的功能和异常处理来满足特定的需求。