一、CyclicBarrier
CyclicBarrier 也叫做栅栏(Barrier)类似于闭锁,它能阻塞一组线程直到某个事件发生。栅栏与闭锁的关键区别在于,所有线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
二、常用方法
方法 | 描述 |
---|---|
int await() | 等待所有各方调用 await此障碍。 |
int await(long timeout, TimeUnit unit) | 等待,直到所有各方都调用 await了此屏障,或者经过了指定的等待时间。 |
int getNumberWaiting() | 返回当前在障碍处等待的参与者数量。 |
int getParties() | 返回克服此障碍所需的各方数目。 |
boolean isBroken() | 查询此屏障是否处于断开状态。 |
void reset() | 将屏障重置为其初始状态。 |
三、示例
在下例代码中,只有 10 个线程都创建完成后才开始一起执行。
public static void main(String[] args) {
CyclicBarrier cyclicBarrier = new CyclicBarrier(10);
ExecutorService executors = Executors.newCachedThreadPool();
System.out.println("---开始任务---");
for (int i = 0; i < 10; i++) {
executors.execute(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "开始等待!");
try {
cyclicBarrier.await(); // 等待所以线程等创建完成
Random random = new Random();
Thread.sleep(random.nextInt(1000));
System.out.println(Thread.currentThread().getName() + "执行完成!");
} catch (InterruptedException | BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}