在Java中,CyclicBarrier是一個同步工具,它允許一組線程等待彼此達到一個共同的屏障點,然后繼續執行。下面是CyclicBarrier的使用方法:
CyclicBarrier barrier = new CyclicBarrier(3, () -> {
System.out.println("All threads have reached the barrier");
});
上述代碼中,我們創建了一個包含3個線程的CyclicBarrier對象,并指定當這3個線程都到達屏障點時,執行的任務是輸出一條消息。
Thread thread1 = new Thread(() -> {
try {
// 線程1執行的任務
System.out.println("Thread 1 has reached the barrier");
barrier.await();
// 屏障點之后繼續執行的任務
System.out.println("Thread 1 is running again");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
});
Thread thread2 = new Thread(() -> {
try {
// 線程2執行的任務
System.out.println("Thread 2 has reached the barrier");
barrier.await();
// 屏障點之后繼續執行的任務
System.out.println("Thread 2 is running again");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
});
Thread thread3 = new Thread(() -> {
try {
// 線程3執行的任務
System.out.println("Thread 3 has reached the barrier");
barrier.await();
// 屏障點之后繼續執行的任務
System.out.println("Thread 3 is running again");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
});
thread1.start();
thread2.start();
thread3.start();
上述代碼中,我們創建了3個線程,并在每個線程的任務中分別調用了CyclicBarrier的await()方法。當3個線程都調用了await()方法后,它們將會阻塞,直到所有線程都到達屏障點。
Thread 1 has reached the barrier
Thread 2 has reached the barrier
Thread 3 has reached the barrier
All threads have reached the barrier
Thread 1 is running again
Thread 3 is running again
Thread 2 is running again
上述輸出結果顯示,當3個線程都到達屏障點后,執行了屏障點后的任務,并繼續執行了后續的任務。
注意事項:
CyclicBarrier的await()方法會拋出InterruptedException和BrokenBarrierException異常,需要進行異常處理。
CyclicBarrier對象可以重用,即可以在線程到達屏障點后重新使用。