1、CountDownLatch :能够使一个或多个线程等待其他线程完成各自的工作后再执行
2、CyclicBarrier : 让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行。
3、Semaphore : 用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理地使用公共资源
4、Exchanger : 用于线程间协作的工具类
重点:CountDownLatch和CyclicBarrier可以让线程池执行完后再执行主线程,还有使用并发包下面的Future类
2、CyclicBarrier :让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续运行
功能是:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障,所有被屏障拦截的线程才会继续执行。
它通过调用await方法让线程进入屏障,每次做加法运算。
底层实现:是通过ReentrantLock以及Condition中的await和signal实现
列子:
public static void main(String[] args) {
CyclicBarrier cyclicBarrier=new CyclicBarrier(5,()->{
System.out.println("老板宣布人够了开始开会!!");
});
for (int i=1;i<=5;i++){
new Thread(()->{
try {
System.out.println(Thread.currentThread().getName()+"签到!");
cyclicBarrier.await(); //如果等待的线程数未到,这里将一直等待
//等线程数够了下面语句将继续执行......
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
},"第"+i+"个人").start();
}
}
打印结果如下:
第1个人签到!
第3个人签到!
第2个人签到!
第5个人签到!
第4个人签到!
老板宣布人够了开始开会!!