CyclicBarrier是Java并發包中的一個同步工具類,它允許一組線程互相等待,直到所有線程都到達某個屏障點(barrier point)后再繼續執行。CyclicBarrier的名字中的“Cyclic”意味著它可以重復使用,即當所有線程都到達屏障點后,屏障會被重置,可以再次使用。
CyclicBarrier提供了兩個構造方法:
public CyclicBarrier(int parties)
public CyclicBarrier(int parties, Runnable barrierAction)
parties
:表示需要等待的線程數量。barrierAction
:當所有線程都到達屏障點時,會執行的一個Runnable任務。await()
:線程調用此方法表示已經到達屏障點,并等待其他線程到達。當所有線程都到達屏障點后,屏障會打開,所有線程繼續執行。await(long timeout, TimeUnit unit)
:與await()
類似,但增加了超時機制。如果在指定時間內沒有所有線程都到達屏障點,則會拋出TimeoutException
。getNumberWaiting()
:返回當前在屏障處等待的線程數量。getParties()
:返回需要等待的線程數量。isBroken()
:判斷屏障是否處于“破損”狀態。如果某個線程在等待時被中斷或超時,屏障會被標記為“破損”。以下是一個簡單的示例,展示了如何使用CyclicBarrier來同步多個線程:
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierExample {
public static void main(String[] args) {
int numThreads = 3;
CyclicBarrier barrier = new CyclicBarrier(numThreads, () -> {
System.out.println("所有線程已到達屏障點,繼續執行");
});
for (int i = 0; i < numThreads; i++) {
new Thread(new Task(barrier), "Thread-" + i).start();
}
}
static class Task implements Runnable {
private CyclicBarrier barrier;
public Task(CyclicBarrier barrier) {
this.barrier = barrier;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName() + " 正在執行任務");
Thread.sleep((long) (Math.random() * 2000));
System.out.println(Thread.currentThread().getName() + " 到達屏障點");
barrier.await();
System.out.println(Thread.currentThread().getName() + " 繼續執行");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
}
}
在這個示例中,我們創建了3個線程,每個線程在執行完任務后會調用barrier.await()
方法,等待其他線程到達屏障點。當所有線程都到達屏障點后,屏障會打開,所有線程繼續執行。
CyclicBarrier適用于需要多個線程協同工作的場景,例如:
CyclicBarrier和CountDownLatch都是用于線程同步的工具類,但它們有一些區別:
barrierAction
),而CountDownLatch沒有這個功能。CyclicBarrier是Java并發編程中一個非常有用的工具類,它可以幫助我們實現多個線程之間的同步。通過CyclicBarrier,我們可以讓一組線程在某個屏障點等待,直到所有線程都到達后再繼續執行。CyclicBarrier的可重用性使其在需要多次同步的場景中非常有用。在實際開發中,我們可以根據具體需求選擇合適的同步工具類,以提高程序的并發性能和可靠性。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。