目录
CountDownLatch
CountDownLatch和join的功能类似,也就是让一个线程等待其他线程都执行完,再执行后续的内容。但是功能更多。
CountDownLatch的构造函数里面传入一个int变量作为计数器的值,表示等待N个点完成。这N个点可以放在不同线程里表示等待着N各线程的完成,也可以放在一个线程的不同位置,表示等待不同步骤的完成。然后在每个点放置CountDownLatch的countDown(),每执行一次计数器减1(如果要在多线程调用这个,只需要把CountDownLatch对象的引用传入这个线程的构造函数),CountDownLatch的await()在计数器为0之前,会阻塞调用它的线程。当然调用await的时候也可以传入一个timeout的参数,只等待固定的时间。
CyclicBarrier同步屏障
Cyclic表示循环的、可重复使用的,barrier表示屏障,他做的事是:当一个线程到达屏障点时,会被阻塞,直到最后一个线程到达屏障点时,所有的屏障才会开门,所有的线程才能继续运行。
可以在构造函数里面设置一个int型变量表示设置的同步屏障的个数,然后每个线程同样调用await()在此阻塞,等待最后一个线程到达屏障点。此外,构造函数里面还可以传入一个线程barrierAction,用于在所有线程到达屏障时优先执行barrierAction的内容。
这个的应用场景是:比如要其他的线程首先计算各自的账单,最后计算总账单的平均数,就可以创建很多个线程先计算各自的账单,计算完之后遇到await()等待,直到最后一个线程遇到await()之后,立马执行计算平均数的线程。
两者的区别
CountDownLatch是一次性的,只能使用一次。CyclicBarrier可以重复使用,调用它的reset()之后就会重置,因此CyclicBarrier可以用于更复杂的业务场景。比如CyclicBarrier还提供方法来获得当前阻塞的线程个数。
此外,CountDownLatch是一个线程等待多个线程执行完成,但是CyclicBarrier是多个线程等待所有线程执行完。