----------------------------------------------------笔者才疏学浅,如有错误,请各位大佬指正------------------------------------------------------------
注:本文是笔者在网络公开课学习到,总结而成的。
这篇博客主要为大家介绍CountDownLatch、CyclicBarrier、Phaser三个类。其中CountDownLatch、CyclicBarrier自JDK1.5出现,而Phaser从JDK1.7才出现。
先来了解一下基础理论知识:
并发协同原理:多线程并发,协同完成一件事,但需要根据需求阻塞一些线程以完成工作。
并发编程套路:①并发的是什么?②在什么地方协同?③谁来等待?谁来通知?
并发方式:①synchronized,Object.wait(),Object.notify(),Object.notifyAll();
②Lock以及Conditional.await(),Conditional.signal();
③java并发包下的协同API
本文将重点介绍:CountDownLatch倒计数锁存器
CyclicBarrier、Phaser将在分别在本系列(二)(三)中介绍
另外还有Semaphone计数信息器,请有兴趣的大佬自行了解。本文不做介绍。
看过《天龙八部》的都应该清楚:段延庆叶二娘南海鳄神云中鹤相约在一个山顶准备刺杀段正淳。这里只说“相约”的事情。
场景:四个人必须都到齐,才能汇合准备下一阶段的事情。
分析:从线程角度考虑,必须四个线程都完成“到”,整体进度才能执行下一个阶段;有人不“到”则“到”的线程阻塞,直到全部“到”齐,所有“到”的都被唤醒。
基于这种情况,向大家介绍CountDownLatch类:
//本类用途:协同控制一个或多个线程等待其他线程中执行的一组操作完成,在继续执行。
public class CountDownLatch {
//构造方法
//count执行等待的条件数(操作数、任务数),不可再更改
public class CountDownLatch(int count) {...}
//等待方法
//await()阻塞等待线程知道条件都满足(count等待条件计数减少到0)
//如果count已是0,则不会阻塞,继续执行
public void await(){...}
//条件完成减计数方法
//每一条件在完成时,都调用countDown()来对count计数减一。
public void countDown() {}
//以下方法不是本文重点
//阻塞等待最多最长时间。
//返回true表示的等待条件到达;false表示条件未到达但是时间到了。
public boolean await(long timeout , TimeUnit unit){...}
//获取当前计数值,该方法常用于调试或测试。
public long getCount() {}
}
以上就是CountDownLatch类部分代码(其中有一个私有静态类Sync,其继承自AbstractQueuedSynchronizer,需要了解CountDownLatch原理的请自行阅读)。
注意!——只可使用一次,不可重复使用!
每个CountdDownLatch对象,只可使用一次,计数变为0后。就不可再用了!
CountDownLatch使用套路:①new设数量②设定中断点await③每个线程完成前countdown
CountDownLatch countDownLatch = new CountDownLatch(4);
for(int i = 0 ; i < 4 ; i++) {
new Thread(){
@Override
public void run() {
System.out.println("四大恶人到达数+1");
countDownLatch.countDown();
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();;
}
System.out.println("磨刀霍霍向正淳");
没错学到了套路就是这么简单。