多线程中的CountDownLatch闭锁(倒计时锁)学习和用例
1.CountDownLatch的构造方法接收一个int的参数作为计数器,如果你想等待N个点,这里传入N.
2.当我们调用countDown()方法时,N就会减一,await()方法会阻塞线程,直到N变为0,所以N可以是N个线程,也可以是N个执行步骤,用在多个线程时,只需要把CountDownLatch的引用传递给线程即可。
总结一句话:相当于老师要上课,必须所有的同学都到齐了才能开始,差一个也不行,班级里每次来一个学生就调用countDown()方法一次,也就是N减一,直到N变为0时开始上课。
废话不多说,直接上代码
package java中的并发工具类;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest {
static CountDownLatch c = new CountDownLatch(3);
public static void main(String[] args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 30; i++) {
System.out.println("t1执行第"+i+"个!");
}
System.out.println("t1执行完毕。");
c.countDown();
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 60; i++) {
System.out.println("t2执行第"+i+"个!");
}
System.out.println("t2执行完毕。");
c.countDown();
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 90; i++) {
System.out.println("t3执行第"+i+"个!");
}
System.out.println("t3执行完毕。");
c.countDown();
}
});
System.out.println("t1,t2,t3开始。。。");
t1.start();t2.start();t3.start();
long time1 = System.nanoTime();
System.out.println("await阻塞当前主线程 time:"+time1);
c.await();
long time2 = System.nanoTime();
System.out.println("t1,t2,t3执行完毕以后开始执行main方法的循环打印。。。 纳秒:"+(time2-time1));
for (int i = 0; i < 10; i++) {
System.out.println("main执行第"+i+"个!");
}
System.out.println("main执行完毕。");
}
}
打印结果:
t1,t2,t3开始。。。
await阻塞当前主线程 time:538390978398400
t2执行第0个!
t3执行第0个!
t3执行第1个!
t3执行第2个!
t3执行第3个!
t3执行第4个!
t3执行第5个!
t3执行第6个!
t3执行第7个!
t3执行第8个!
t3执行第9个!
t3执行第10个!
t3执行第11个!
t1执行第0个!
t1执行第1个!
t1执行第2个!
t1执行第3个!
t1执行第4个!
t1执行第5个!
t1执行第6个!
t1执行第7个!
t1执行第8个!
t1执行第9个!
t1执行第10个!
t3执行第12个!
t3执行第13个!
t3执行第14个!
t3执行第15个!
t3执行第16个!
t2执行第1个!
t2执行第2个!
t2执行第3个!
t2执行第4个!
t2执行第5个!
t2执行第6个!
t2执行第7个!
t2执行第8个!
t2执行第9个!
t2执行第10个!
t2执行第11个!
t2执行第12个!
t2执行第13个!
t2执行第14个!
t3执行第17个!
t3执行第18个!
t3执行第19个!
t3执行第20个!
t3执行第21个!
t3执行第22个!
t3执行第23个!
t1执行第11个!
t1执行第12个!
t1执行第13个!
t1执行第14个!
t1执行第15个!
t1执行第16个!
t1执行第17个!
t1执行第18个!
t1执行第19个!
t1执行第20个!
t1执行第21个!
t3执行第24个!
t3执行第25个!
t3执行第26个!
t3执行第27个!
t3执行第28个!
t2执行第15个!
t2执行第16个!
t2执行第17个!
t2执行第18个!
t2执行第19个!
t2执行第20个!
t2执行第21个!
t2执行第22个!
t2执行第23个!
t2执行第24个!
t2执行第25个!
t3执行第29个!
t3执行第30个!
t3执行第31个!
t3执行第32个!
t3执行第33个!
t3执行第34个!
t3执行第35个!
t3执行第36个!
t3执行第37个!
t3执行第38个!
t1执行第22个!
t1执行第23个!
t1执行第24个!
t3执行第39个!
t3执行第40个!
t3执行第41个!
t3执行第42个!
t3执行第43个!
t3执行第44个!
t3执行第45个!
t3执行第46个!
t3执行第47个!
t3执行第48个!
t3执行第49个!
t3执行第50个!
t3执行第51个!
t3执行第52个!
t3执行第53个!
t3执行第54个!
t3执行第55个!
t3执行第56个!
t3执行第57个!
t2执行第26个!
t2执行第27个!
t2执行第28个!
t3执行第58个!
t3执行第59个!
t3执行第60个!
t3执行第61个!
t3执行第62个!
t3执行第63个!
t3执行第64个!
t3执行第65个!
t3执行第66个!
t3执行第67个!
t1执行第25个!
t1执行第26个!
t1执行第27个!
t1执行第28个!
t1执行第29个!
t1执行完毕。
t3执行第68个!
t3执行第69个!
t3执行第70个!
t3执行第71个!
t3执行第72个!
t3执行第73个!
t3执行第74个!
t2执行第29个!
t2执行第30个!
t2执行第31个!
t2执行第32个!
t2执行第33个!
t2执行第34个!
t2执行第35个!
t2执行第36个!
t2执行第37个!
t2执行第38个!
t2执行第39个!
t2执行第40个!
t2执行第41个!
t2执行第42个!
t2执行第43个!
t2执行第44个!
t2执行第45个!
t2执行第46个!
t2执行第47个!
t2执行第48个!
t2执行第49个!
t2执行第50个!
t2执行第51个!
t2执行第52个!
t2执行第53个!
t2执行第54个!
t2执行第55个!
t2执行第56个!
t2执行第57个!
t2执行第58个!
t2执行第59个!
t2执行完毕。
t3执行第75个!
t3执行第76个!
t3执行第77个!
t3执行第78个!
t3执行第79个!
t3执行第80个!
t3执行第81个!
t3执行第82个!
t3执行第83个!
t3执行第84个!
t3执行第85个!
t3执行第86个!
t3执行第87个!
t3执行第88个!
t3执行第89个!
t3执行完毕。
t1,t2,t3执行完毕以后开始执行main方法的循环打印。。。 纳秒:3807700
main执行第0个!
main执行第1个!
main执行第2个!
main执行第3个!
main执行第4个!
main执行第5个!
main执行第6个!
main执行第7个!
main执行第8个!
main执行第9个!
main执行完毕。