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的这种方式,不论对个人还是对团队,都是一种很大的伤害。
在公司中上班,要的不是技术上多牛逼,而是要开发出稳定高可用可扩展性强的代码。也基于此,要分析清楚业务逻辑和业务流程,这样才能更加贴近业务,使用更加优秀的架构。无论是微服务还是各种大数据框架,适合自己公司的才最重要。
也希望,中国的技术环境,科研的归科研,技术应用归技术应用,面试造火箭,工作拧螺丝的事情能够少点再少点。
来源:https://blog.csdn.net/hccc1/article/details/102778668