第8章 Java中的并发工具类
8.1 等待多线程完成的CountDownLatch
CountDownLatch countDownLatch = new CountDownLatch(N) 构造方法中的N表示期望等待N个点完成
countDownLatch.count(); 调用该方法后 N就会减1
countDownLatch.await(); 阻塞当前线程直到N变为0
8.2 同步屏障CyclicBarrier
让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会打开,所有被屏障拦截的线程才会继续运行
8.2.1 CyclicBarrier简介
CyclicBarrier cyclicBarrier = new CyclicBarrier(parties) 屏障拦截的线程数量
Cyclicbarrier cyclicBarrier = new CyclicBarrier(parties,barrierAction) 所有线程都到达屏障后,优先执行barrierAction线程
cyclicBarrier.await() 线程中调用此方法,表示线程已到达屏障
8.2.2 CyclicBarrier应用场景 多线程计算数据,最后合并计算结果
8.2.3 CyclicBarrier和CountDownLatch的区别
CountDownLatch的计数器只能计数一次,Cyclicbarrier可以调用reset方法重置计数器,能够处理更复杂的业务场景。例如,如果计算发生错误可以重置计数器,并让线程重新执行一次
cyclicBarrier.getNumberWaiting() 可以获得阻塞线程的数量
cyclicBarrier.isBroke() 可以了解阻塞的线程是否被中断(thread.interrupt())
8.3 控制线程并发数的Semaphore
用来控制访问特定资源的线程数量
应用场景:流量控制,特别是公共资源有限的场景。例如数据库最大连接数为10,最多允许10个线程并发执行
Semaphore semaphore = new semaphore(10); // 10:许可证数量
new Runnable({
@Override
public void run(){
semaphore.acquire(); // 获取许可证
// 执行操作
semaphore.release(); // 释放许可证
}
})
其他方法:
int availablePermits():返回次信号量中当前可用的许可证数。
int getQueueLength():返回正在等待许可证的线程数量。
boolean hasQueuedThreads():是否有排队等待许可证的线程
void reducePermits(int reduction) 减少reduction个许可证
Collection getQueuedThreads() 返回等待获取许可证的线程集合
8.4 线程间交换数据的Exchanger
它提供一个同步点,两个线程可以在同步点交换数据。当一个线程调用exchange方法时会一直等待另一个线程调用exchange方法来交换各自生产出的数据
应用场景:遗传算法——选出两个人作为交配对象,交换两人的数据,使用交叉规则得到交配结果
校对工作——对比两个计算结果进行校对,看数据是否一致
Exchanger<String> exchanger = new Exchanger<String>();
exchanger.exchange("A");