Administrator
发布于 2024-08-07 / 25 阅读
0
0

利用notify 和wait方法实现CyclicBarrier

在 Java 中,可以使用 waitnotify 方法来实现类似 CyclicBarrier 的同步机制。以下是使用 waitnotify 方法实现自定义 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 这样的回调机制。在实际应用中,你可能需要添加更多的功能和异常处理来满足特定的需求。


评论