Java中的 CyclicBarrier詳解

小云
111
2023-08-11 14:37:03

CyclicBarrier是Java中的一個(gè)同步輔助類(lèi),它允許一組線(xiàn)程在到達(dá)某個(gè)屏障點(diǎn)之前互相等待。當(dāng)所有線(xiàn)程都到達(dá)屏障點(diǎn)后,屏障點(diǎn)將被打開(kāi),所有線(xiàn)程將繼續(xù)執(zhí)行。

CyclicBarrier的主要特點(diǎn)如下:

  1. 定義

CyclicBarrier類(lèi)的定義如下:

public class CyclicBarrier {
// ...
}

CyclicBarrier類(lèi)提供了多個(gè)構(gòu)造方法,用于指定等待線(xiàn)程數(shù)量和屏障點(diǎn)達(dá)成時(shí)的操作。

  1. 使用場(chǎng)景

CyclicBarrier適用于多線(xiàn)程間需要相互等待的場(chǎng)景,例如多線(xiàn)程的并行計(jì)算、分布式系統(tǒng)的任務(wù)分配等。

  1. 使用方法

CyclicBarrier的主要方法如下:

  • public CyclicBarrier(int parties, Runnable barrierAction):創(chuàng)建一個(gè)新的CyclicBarrier實(shí)例,指定等待線(xiàn)程數(shù)量和屏障點(diǎn)達(dá)成時(shí)的操作。

  • public int await():線(xiàn)程調(diào)用await方法后將被阻塞,直到所有線(xiàn)程都調(diào)用了該方法。返回值為當(dāng)前線(xiàn)程在屏障點(diǎn)的位置。

  • public int await(long timeout, TimeUnit unit):線(xiàn)程調(diào)用await方法后將被阻塞,直到所有線(xiàn)程都調(diào)用了該方法或達(dá)到指定的超時(shí)時(shí)間。

CyclicBarrier還提供了其他一些方法,如public int getParties()、public int getNumberWaiting()等,用于獲取相關(guān)信息。

  1. 示例代碼

下面是一個(gè)使用CyclicBarrier的簡(jiǎn)單示例代碼:

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();
}
}
}

運(yùn)行以上代碼會(huì)輸出以下結(jié)果:

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

以上代碼創(chuàng)建了5個(gè)線(xiàn)程,每個(gè)線(xiàn)程都會(huì)調(diào)用await方法等待其他線(xiàn)程到達(dá)屏障點(diǎn)。當(dāng)所有線(xiàn)程都到達(dá)屏障點(diǎn)后,屏障點(diǎn)將被打開(kāi),所有線(xiàn)程將繼續(xù)執(zhí)行。

總結(jié):CyclicBarrier是Java中的一個(gè)同步輔助類(lèi),它允許一組線(xiàn)程在到達(dá)某個(gè)屏障點(diǎn)之前互相等待。使用CyclicBarrier可以實(shí)現(xiàn)線(xiàn)程間的同步操作,適用于多線(xiàn)程間需要相互等待的場(chǎng)景。

0