一.概述
使用JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,如何让各个线程之间协作完成某项工作。有时候,我们启动N个线程去做一件事情,只有当这N个线程都达到某一个临界点的时候,我们才能继续下面的工作,就是说如果这N个线程中的某一个线程先到达预先定义好的临界点,它必须等待其他N-1线程也到达这个临界点,接下来的工作才能继续,只要这N个线程中有1个线程没有到达所谓的临界点,其他线程就算抢先到达了临界点,也只能等待,只有所有这N个线程都到达临界点后,接下来的事情才能继续。
在日常工作中,我们经常和别人一起合作做一些项目,项目中有一些关键点,比如说代码联调,假如有M个开发人员,要想进行联调,这M个开发人员都必须到达这个临界点——把自己的功能模块完成,否则就无法进行联调。
二.CyclicBarrier的图示
关于上面的图片,首先A,B,C,D四个线程跑起来之后,发现向前推进的速度不一样,在某一时刻发现A,B,C已经到达临界点,但是D还没有到达临界点,此时A,B,C只能等待,当D到达临界点之后,A,B,C,D才能一起越过屏障,进行下面的工作。
三.分析一段CyclicBarrier的代码
import java.util.concurrent.CyclicBarrier;
class PerformTest {
private int threadCount; // 线程数目
private CyclicBarrier cycliBarrier;
private int loopCount = 10;
public PerformTest(int threadCount){
this.threadCount = threadCount;
// 创建一个新的屏障,只有所有线程达到临界点之后,这里的匿名线程对象才会被执行
this.cycliBarrier = new CyclicBarrier(this.threadCount, new Runnable() {
/**
* <pre>
* 当所有线程都达到某个点的时候,这个方法就会被调用
* </pre>
*/
@Override
public void run() {
collectTestResult();
}
});
for (int i = 0; i < this.threadCount; ++i) {
Thread t = new Thread("working thread " + i) {
@Override
public void run() {
for (int j = 0; j < loopCount; ++j) {
doTest();
try {
/* 在这里如果发现计数值不是0的话,就会发生线程的阻塞,注意体会这里对于
* 对于cycliBarrier的循环利用
*/
cycliBarrier.await();
} catch (Exception e) {
System.out.println(e);
}
}
}
};
t.start();
}
}
private void collectTestResult() {
System.out.println("All Threads have been tested, and the result has been collected!");
}
private void doTest() {
System.out.println(Thread.currentThread().getName() + " is tested!");
}
}
public class CyclicBarrierTest1 {
public static void main(String[] args) {
new PerformTest(2);
}
}
输出结果如下:
working thread 0 is tested!
working thread 1 is tested!
All Threads have been tested, and the result has been collected!
working thread 1 is tested!
working thread 0 is tested!
All Threads have been tested, and the result has been collected!
working thread 0 is tested!
working thread 1 is tested!
All Threads have been tested, and the result has been collected!
working thread 1 is tested!
working thread 0 is tested!
All Threads have been tested, and the result has been collected!
working thread 0 is tested!
working thread 1 is tested!
All Threads have been tested, and the result has been collected!
working thread 1 is tested!
working thread 0 is tested!
All Threads have been tested, and the result has been collected!
working thread 0 is tested!
working thread 1 is tested!
All Threads have been tested, and the result has been collected!
working thread 1 is tested!
working thread 0 is tested!
All Threads have been tested, and the result has been collected!
working thread 0 is tested!
working thread 1 is tested!
All Threads have been tested, and the result has been collected!
working thread 1 is tested!
working thread 0 is tested!
All Threads have been tested, and the result has been collected!
下面我们来分析一下上述这段代码的输出结果:
在程序中我们创建的两个线程,working thread 1和working thread 2。这两个线程内部都有10次for循环,cycliBarrier的总数是线程数2。线程1运行起来,在进行一次for循环之后,线程就处于等待状态,此时cycliBarrier中等待的数目变为1,由于线程处于等待状态,此时线程1无法继续向下进行,过一会working thread 2开始运行,在第一次for循环中cycliBarrier中的等待数目变为0,此时线程working thread 1被唤醒,working thread 1继续第二次循环,在第二次循环开始时,cycliBarrier就开始重复利用了,当cycliBarrier的等待数目变为0后,cycliBarrier就会恢复初始状态,进行再一次的并发流程控制。后面的运行过程是一样的,至于cycliBarrier的等待计数为0后,working thread 1和working thread 2那个先开始运行,要看具体的调度机制了。
四.CycliBarrier和CountDownLatch的区别
CycliBarrier和CountDownLatch都可以用来控制并发执行的流程,保证所有线程都做完自己的工作后在继续一些共性的工作。
1.CycliBarrier可以重复利用,但是CountDownLatch不可以重复利用。
2.CountDownLatch中计数值的递减需要自己手动去触发,但是CycliBarrier中计数值的减小是自动减小的。
- 大小: 93.7 KB
分享到:
相关推荐
在Java并发编程中,多线程是核心概念之一。多线程允许程序同时执行多个任务,从而充分利用系统资源,提高程序性能。然而,多线程编程也带来了同步和竞态条件等问题,这需要开发者具备良好的线程管理和同步机制的知识...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
根据提供的信息,“Java 并发编程实战.pdf”这本书聚焦于Java并发编程的实践与应用,旨在帮助读者深入了解并掌握Java中的多线程技术及其在实际项目中的应用技巧。虽然部分内容未能提供具体章节或实例,但从标题及...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
《Java并发编程从入门到精通》是一本专为Java开发者设计的深度学习并发编程的书籍。作者韩剑锋,凭借其12年的IT行业经验,曾担任多家IT公司的研发总监和技术总监,以其丰富的实战经验和深厚的理论知识,为读者提供了...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
Java并发编程(CyclicBarrier)实例详解 Java并发编程(CyclicBarrier)实例详解主要介绍了Java并发编程(CyclicBarrier)实例详解的相关资料,JAVA编写并发程序的时候,我们需要仔细去思考一下并发流程的控制,...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
### Java并发编程实践 #### 一、并发编程基础 ##### 1.1 并发与并行的区别 在Java并发编程中,首先需要理解“并发”(Concurrency)和“并行”(Parallelism)的区别。“并发”指的是多个任务在同一时间段内交替...
Java并发编程是Java开发者必须掌握的关键技能之一,它涉及到如何在多线程环境中高效、安全地执行程序。并发编程能够充分利用多核处理器的计算能力,提高应用程序的响应速度和整体性能。《Java编程并发实战》这本书是...
根据提供的文件信息,“JAVA并发编程实践 中文 高清 带书签 完整版 Doug Lea .pdf”,我们可以推断出这份文档主要聚焦于Java并发编程的技术实践与理论探讨。下面将从多个角度来解析这个文档可能涵盖的关键知识点。 ...
本资料“Java并发编程设计原则和模式”深入探讨了如何在Java环境中有效地进行并发处理,以充分利用系统资源并避免潜在的并发问题。 一、并发编程基础 并发是指两个或多个操作在同一时间段内执行,但并不意味着这些...
Java并发编程是Java开发中的重要领域,特别是在大型分布式系统、多线程应用和服务器端程序设计中不可或缺。这个资源包“Java并发编程从入门到精通源码.rar”显然是为了帮助开发者深入理解并掌握这一关键技能。它包含...
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
《Java并发编程实战》是Java开发者深入理解和掌握并发编程的一本经典著作。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者在多核时代编写出高效、可伸缩且线程安全的代码。 并发编程是现代...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。阿里大牛梁飞编写的《Java并发编程常识》PPT,深入浅出地讲解了这个主题,对开发者来...
Java并发编程是Java开发中的重要领域,涉及到多线程、同步机制、线程池等多个核心概念,对于构建高效、稳定的应用至关重要。这份资料包含了关于Java并发编程的博客和网页,可以提供深入的理解和实践指导。 在Java...