Open chengfengjie opened 6 years ago
CyclicBarrier
的字面意思是可循环使用的屏障,功能是让一组线程到达一个屏障(也可以叫做同步点)时被阻塞,直到最后一个线程到达屏障,屏障才会开门,所有被屏障拦截的线程才回继续执行。
例子:
public class CyclicBarrierTest {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
public static void main(String[] args) {
new Thread(() -> {
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(1);
}).start();
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(2);
}
}
CyclicBarrier
默认构造方法是CyclicBarrier(int parties)
,其参数表示屏障拦截的线程数量,每个线程调用await
方法告诉CyclicBarrier
我已经到达了屏障,然后当前线程被阻塞。直到最后一个线程到达屏障,所有线程继续执行
CyclicBarrier
还提供一个更高级的构造函数CyclicBarrier(int parties, Runnable barrierAction)
,用于线程到达屏障时候,有限执行barrierAction
,方便处理更复杂的业务场景
例子
static class Action implements Runnable {
@Override
public void run() {
System.out.println(3);
}
}
static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Action());
public static void main(String[] args) {
new Thread(() -> {
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(1);
}).start();
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(2);
}
CountDownLatch
的计数器只能使用一次,CyclicBarrier
的计数器可以通过reset()
方法重置。所以CyclicBarrier
能够处理更为复杂的应用场景
等待多线程完成的CountDownLatch
CountDownLatch
允许一个或者多个线程等待其他线程完成操作。一个例子:
CountDownLatch
的构造器接收一个int
类型的参数作为计数器,如果你想等待N个点完成,这里就传入N。当我们调用CountDownLatch
的countDown
方法时, N就会减去1,CountDownLatch
的await
方法会阻塞当前线程,直到N变成0。由于countDown
方法可以用在任何地方,所以这里说的N个点,可以是N个线程,也可以是一个线程里的N个执行步骤。CountDownLatch
的await(long time, TimeUnit unit)
方法可以传入一个等待时间,在超过这个等待时间后,就会不在阻塞当前线程,join()
方法也有类似的方法