java 并发 CyclicBarrier - CunDeveloper/com.nju.edu.cn.software.school.friend.service GitHub Wiki

CyclicBarrier 定义

CyclicBarrier 是java.util.concurrent下并发类。此类是用来实现同步机制在一组线程上。即此类是一个障碍,在别的线程到达之前,所有的线程必须进行等待。只用当所有的线程到达某一点后,任何线程可以继续执行。执行图如下:

说明:这两个线程相互等待通过调用CyclicBarrier的await()方法。一旦线程1和线程2都调用了await()方法。则这两个线程将再继续执行。

创建一个CyclicBarrier

当你创建一个CyclicBarrier对象时你必须规定有多个线程在CyclicBarrier上进行等待在释放之前。在释放之后,等待的这些线程将继续执行别的代码。

 CyclicBarrier barrier = new CyclicBarrier(2);

在CyclicBarrier上进行等待

通过调用下面的代码表示等待:

barrier.await();

我们可以规定了一个超时时间为等待的线程。当超时时间到达时,等待的线程也会被释放。即使不是N个线程等待在CyclicBarrier对象上。规定超时等待的代码如下:

barrier.await(10, TimeUnit.SECONDS);

正在等待的线程继续等待直到有一下条件发生:

  • 最后一个线程到达(通过调用CyclicBarrier的await())
  • 线程被中断通过其他线程调用interrupt()
  • 任何一个正在等待的线程被中断
  • 任何一个正在等待的线程超时在CyclicBarrier对象
  • 一些外部的线程调用CyclicBarrier.reset()方法

CyclicBarrier的Action

CyclicBarrier支持一个Barrier Action。当最后一个线程通过调用CyclicBarrier对象的await()方法时,此Action将会被执行,Action是一个实现了Runnable接口的对象。举例如下:

Runnable      barrierAction = ... ;
CyclicBarrier barrier       = new CyclicBarrier(2, barrierAction);