CyclicBarrier是Java中的一個同步輔助類,它允許一組線程在到達某個屏障點之前互相等待。當所有線程都到達屏障點后,屏障點將被打開,所有線程將繼續執行。
CyclicBarrier的主要特點如下:
CyclicBarrier類的定義如下:
public class CyclicBarrier {
// ...
}
CyclicBarrier類提供了多個構造方法,用于指定等待線程數量和屏障點達成時的操作。
CyclicBarrier適用于多線程間需要相互等待的場景,例如多線程的并行計算、分布式系統的任務分配等。
CyclicBarrier的主要方法如下:
public CyclicBarrier(int parties, Runnable barrierAction)
:創建一個新的CyclicBarrier實例,指定等待線程數量和屏障點達成時的操作。
public int await()
:線程調用await方法后將被阻塞,直到所有線程都調用了該方法。返回值為當前線程在屏障點的位置。
public int await(long timeout, TimeUnit unit)
:線程調用await方法后將被阻塞,直到所有線程都調用了該方法或達到指定的超時時間。
CyclicBarrier還提供了其他一些方法,如public int getParties()
、public int getNumberWaiting()
等,用于獲取相關信息。
下面是一個使用CyclicBarrier的簡單示例代碼:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
private static final int THREADS_COUNT = 5;
private static final CyclicBarrier BARRIER = new CyclicBarrier(THREADS_COUNT, () -> {
System.out.println("All threads have reached the barrier");
});
public static void main(String[] args) {
for (int i = 0; i < THREADS_COUNT; i++) {
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + " is waiting at the barrier");
BARRIER.await();
System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}
}
}
運行以上代碼會輸出以下結果:
Thread-0 is waiting at the barrier
Thread-1 is waiting at the barrier
Thread-2 is waiting at the barrier
Thread-3 is waiting at the barrier
Thread-4 is waiting at the barrier
All threads have reached the barrier
Thread-4 has crossed the barrier
Thread-1 has crossed the barrier
Thread-0 has crossed the barrier
Thread-3 has crossed the barrier
Thread-2 has crossed the barrier
以上代碼創建了5個線程,每個線程都會調用await方法等待其他線程到達屏障點。當所有線程都到達屏障點后,屏障點將被打開,所有線程將繼續執行。
總結:CyclicBarrier是Java中的一個同步輔助類,它允許一組線程在到達某個屏障點之前互相等待。使用CyclicBarrier可以實現線程間的同步操作,適用于多線程間需要相互等待的場景。