CountDownLatch使用初窥

家住魔仙堡 提交于 2019-12-02 15:13:38

1. 背景

最近,在做大数据方面的开发工作,对JAVA中线程之间的竞争和先后执行顺序产生了疑问,因此学习一下并发编程的高级写法,这边主要讲解一下CountDownLatch的使用方式。

2. 使用方式

我们在进行大数据操作的时候,需要分阶段分步骤进行数据操作,比如,在大数据分析中,我们首先要对数据进行去重,并进行数据预处理操作。针对文本操作的NLP方式,还需要将数据向量化。因此,在工程领域,我们可以定义整个数据的加工过程,并实现自动化操作。以下,来看下今天的实验:

我们要实验以下这个图,1.1和1.2并行,2必须等1.1和1.2结束后串行。然后3.1、3.2、3.3并行,同理,4必须等3操作执行完后才能操作,我们应该怎么实现以下的流程图呢?
在这里插入图片描述

看下面的例子背景:

package chapter1;

import java.util.concurrent.CountDownLatch;

public class MyThread1 extends Thread{
	
	public String order;
	public static CountDownLatch cd;
	public MyThread1(String order, CountDownLatch cd) {
		this.order = order;
		this.cd = cd ;
	}
	@Override
	public void run() {
		System.out.println(order);	
		cd.countDown();
	}
}
class MyThread2 extends Thread{
	public String order;

	public MyThread2(String order) {
		this.order = order;
	}
	
	@Override
	public void run() {
		System.out.println(order);	
	}
}

这边定义了两个线程的方式,一个需要传递CountDownLatch实例,用来处理并行的countDown的操作;

另外一个是普通的线程,用来处理单线程操作的方式。

3. 业务核心代码

package chapter1;

import java.util.concurrent.CountDownLatch;

/**
 * 测试栅栏模式,只有3个3通道都通过的时候(CountDownLatch等于0的时候), 4才能运行; 2同理
 * @ClassName: TestCountDownLatch 
 * @Description: TODO
 * @author: Yel
 * 
 * 
 * 1.1----|           |----> 3.1---->|
 *        |---->2---->|----> 3.2---->|----> 4 ----> end
 * 1.2----|           |----> 3.3---->|
 * 
 * 
 * 
 * @date: Oct 28, 2019 11:43:24 AM
 */
public class TestCountDownLatch {

	public static void main(String[] args) {
		CountDownLatch cd1 = new CountDownLatch(2);
		new MyThread1("1.1", cd1).start();
		new MyThread1("1.2", cd1).start();
		try {
			cd1.await();
			new MyThread2("2").start();
			CountDownLatch cd2 = new CountDownLatch(3);
			new MyThread1("3.1", cd2).start();
			new MyThread1("3.2", cd2).start();
			new MyThread1("3.3", cd2).start();
			cd2.await();
			new MyThread2("4").start();
			
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}

我们的操作如上图所示,使用await方法等待所有的前置操作结束,使得CountDownLatch的值为0。

最后的输出结果如下;

在这里插入图片描述

4. 程序人生&一点感想

最后,想抒发一点个人情感。我觉得写代码其实是不太难,难的是在各种压力和需求不清晰的情况下写代码,不管是心里还是脑力上都累,尤其是国内这种996,甚至007的这种方式,不论对个人还是对团队,都是一种很大的伤害。

在公司中上班,要的不是技术上多牛逼,而是要开发出稳定高可用可扩展性强的代码。也基于此,要分析清楚业务逻辑和业务流程,这样才能更加贴近业务,使用更加优秀的架构。无论是微服务还是各种大数据框架,适合自己公司的才最重要。

也希望,中国的技术环境,科研的归科研,技术应用归技术应用,面试造火箭,工作拧螺丝的事情能够少点再少点。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!