多线程-并发:介绍CountDownLatch

----------------------------------------------------笔者才疏学浅,如有错误,请各位大佬指正------------------------------------------------------------

注:本文是笔者在网络公开课学习到,总结而成的。

这篇博客主要为大家介绍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("磨刀霍霍向正淳");

没错学到了套路就是这么简单。

猜你喜欢

转载自blog.csdn.net/monkeydcoding/article/details/81283061