CountDownLatch
它允许一个或多个线程等待其他线程完成操作,相当于join()的功能,但比join()的功能更多。
代码示例
1 | import java.util.concurrent.CountDownLatch; |
执行结果
1 | 1 |
同步屏障CyclicBarrier
让一组线程达到一个屏障(也叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续执行。
代码示例
1 | import java.util.concurrent.BrokenBarrierException; |
运行结果
1 | 1 |
应用场景
用于多线程计算数据,最后合并计算结果的场景。
CyclicBarrier和CountDownLatch的区别
CountDownLatch
的计数器只能使用一次,而CyclicBarrier
的计数器可以使用reset()方法重置CyclicBarrier
还提供其他有用方法,比如getNumberWaiting()
方法可以获得CyclicBarrier
阻塞的线程数量;isBroken()
方法用来了解阻塞的线程是否被中断。
控制线程并发线程数的Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用公共资源。
代码示例
1 | import java.util.concurrent.ExecutorService; |
应用场景: 用作流量控制,比如数据库连接
其他方法
int availablePermits()
:返回此信号量中当前可用的许可证数int getQueueLength()
:返回正在等待获取许可证的线程数boolean hasQueuedThreads()
:是否有线程正在等待获取许可证
线程间交换数据的Exchanger
进行线程间的数据交换,提供一个同步点,两个线程可以在同步点交换彼此的数据。
代码示例
1 | import java.util.concurrent.Exchanger; |
运行结果
1 | pool-1-thread-1:从第二个线程交换回来的值:银行流水B |
应用场景
- 遗传算法,使用交叉规则进行遗传
- 校对工作,比如银行的AB岗电子银行流水录入