1:等待多线程完成的CountDownLatch简介
(1)允许一个或多个线程等待其他线程完成操作。
举个例子:解析一个excel里的多个sheet里的数据。等到所有的sheet都解析完了后,程序需要提示解析完成。
注意:有一种最简单的方法是使用join方法。
注意两者的区别:join实现原理是不停检查join线程是否存活,如果join线程存活则当前线程永远等待。wait(0)表示永远等待。直到join线程中止后,线程的this.notifyAll方法会被调用。
2:同步屏障CyclicBarrier简介
(1)可循环使用Cyclic的屏障Barrier。让一组线程到达一个屏障时被阻塞,直到最后一个线程到达同步点时,屏障才会开门,所有被阻塞的线程才会继续运行。
(2)常用方法
CyclicBarrier(int parties):参数表示屏障拦截的线程数量,每个线程调用await方法告诉CyclicBarrier我已经到达屏障,然后当前线程被阻塞。
CyclicBarrier(int parties , Runnable barrierAction)用于在线程到达屏蔽时,优先执行barrierAction,方便处理更复杂的业务场景。
3:控制并发线程数的Semaphore简介
(1)Semaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源。
(2)应用场景
A: Semaphore可以用于做流量控制,特别是公共资源有限的应用场景,比如数据库连接。
B: xx马路要限制流量,只允许同时有一百辆车在这条路上行驶,其他的都必须在路口等待。
Semaphore常用的方法:
Semaphore(int. permits) 接受一个整型的数字,表示可用的许可证数量。也就是说最大并发数。使用非常方便,调用acquire()方法获取一个许可证,使用完之后调用release()方法归还许可证。还可以使用tryAcquire()方法尝试获取许可证。
intavaliablePermits():返回此信号量中当前可用的许可证数量。
intgetQueueLength():返回正在等待获取许可证的线程数。
booleanhasQueueThreads():是否有线程正在等待获取许可证。
reducePremits(int reduction):减少reduction个许可证,是个protected方法。
Collection getQueuedThreads():返回所有等待获取许可证的线程集合,是个protected方法。
4:线程间交换数据Exchanger简介
(1)Exchanger用于进行线程间的数据交换。它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据。
怎么做到的呢?它提供exchange方法交换数据,如果第一个线程先执行exchange()方法,他会一直等待第二个线程也执行exchange方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。
(2)应用场景:
Exchanger可以用于遗传算法。Exchanger也可以用于校对工作(比如:纸质银行流水变成电子银行流水)。