CyclicBarrier是一個同步輔助類,它允許一組線程互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的線程的程序中,這些線程必須不時地互相等待,此時 CyclicBarrier 很有用。因爲該 barrier 在釋放等待線程後可以重用,所以稱它爲循環 的 barrier。CyclicBarrier 支持一個可選的 Runnable 命令,在一組線程中的最後一個線程到達之後(但在釋放所有線程之前),該命令只在每個屏障點運行一次。若在繼續所有參與線程之前更新共享狀態,此屏障操作很有用。
適用場景:
在某種需求中,比如一個大型的任務,常常需要分配好多子任務去執行,只有當所有子任務都執行完成時候,才能執行主任務,這時候就可以選擇CyclicBarrier。
主要方法:
//設置parties、count及barrierCommand屬性。
CyclicBarrier(int):
//當await的數量到達了設定的數量後,首先執行該Runnable對象。
CyclicBarrier(int,Runnable):
//通知barrier已完成線程
await():
package com.alibaba.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
final int count = 10;
// 定義屏障點
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {
public void run() {
System.out.println("一起去happy.....");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + ": 到達");
try {
barrier.await();
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}).start();
}
}
}
運行結果:
Thread-0: 到達
Thread-2: 到達
Thread-6: 到達
Thread-3: 到達
Thread-7: 到達
Thread-1: 到達
Thread-4: 到達
Thread-5: 到達
Thread-9: 到達
Thread-8: 到達
一起去happy.....
循環使用:
package com.alibaba.concurrent;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class CyclicBarrierTest {
public static void main(String[] args) {
final int count = 10;
// 定義屏障點
final CyclicBarrier barrier = new CyclicBarrier(count, new Runnable() {
public void run() {
System.out.println("一起去happy.....");
}
});
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + ": 到達");
try {
barrier.await();
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}).start();
}
for (int i = 0; i < 10; i++) {
new Thread(new Runnable() {
public void run() {
System.out.println(Thread.currentThread().getName() + ": 到達");
try {
barrier.await();
} catch (InterruptedException e) {
} catch (BrokenBarrierException e) {
}
}
}).start();
}
}
}
運行結果:
Thread-0: 到達
Thread-2: 到達
Thread-1: 到達
Thread-3: 到達
Thread-4: 到達
Thread-8: 到達
Thread-7: 到達
Thread-9: 到達
Thread-5: 到達
Thread-6: 到達
一起去happy.....
Thread-11: 到達
Thread-10: 到達
Thread-12: 到達
Thread-13: 到達
Thread-14: 到達
Thread-15: 到達
Thread-16: 到達
Thread-17: 到達
Thread-18: 到達
Thread-19: 到達
一起去happy.....