`
zhoujiangzi
  • 浏览: 93357 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

java多线程 CountDownLatch

阅读更多

CountDownLatch作为一个同步辅助类,它能够允许一个活多个线程等待,直到计数器为0后,才开始运作。

该功能是在jdk.15之后引入的,这样我们在使用的时候就很方便

里面主要有两个方法

1. countDown : 使计数器减一

2. await :等待计数器减为0后开始运行之后的代码,否则一直处于阻塞状态

 

有了这两个方法,我们能很方便的加入到实际环境中,比如跑步问题

假设运动会上有5个人正在进行跑步比赛,裁判需要等运动员准备完毕后,发出命令,然后运动员开始跑,等所有的运动员都到达终点后,裁判再统计结果

 

package com.jacksoft.thread;

import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class ThreadDownLoadTest {

	/**
	 * 总人数 
	 */
	private static final int P_COUNT = 5;
	
	/**
	 * 裁判人数
	 */
	private static final int TOTAL = 1; 
	
	
	public static void main(String[] args) {
		
		/**
		 *  准备总人数,每准备好一个人,就减一 
		 */
		final CountDownLatch readyCount = new CountDownLatch(P_COUNT);
		
		/**
		 *  跑完人数计数,完成一个人,计数减一
		 */
		final CountDownLatch runCount = new CountDownLatch(P_COUNT);
		
		/**
		 *  发出命令开始跑
		 */
		final CountDownLatch startRecordCount = new CountDownLatch(TOTAL);
		
		for(int i = 1;i <= P_COUNT;i++){
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						Thread.sleep(new Random().nextInt(5000));
						System.out.println("运动员" + Thread.currentThread().getName() + "已经准备完毕,还有" + readyCount.getCount() + "个人正在准备中.....");
						readyCount.countDown();
						startRecordCount.await();
						Thread.sleep(new Random().nextInt(10000));
						System.out.println("运动员" + Thread.currentThread().getName() + "到达终点,还有" + runCount.getCount() + "个人在路上");
						runCount.countDown();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}).start();
		}
			
			try {
				readyCount.await();
				System.out.println("裁判:所有运动员准备完毕,开始跑,等待结果");
				startRecordCount.countDown();
				runCount.await();
				System.out.println("裁判:跑步完毕,统计结果...");
			} catch (Exception e) {
				e.printStackTrace();
			}
			
		
	}
}

 运行结果:

运动员Thread-3已经准备完毕,还有5个人正在准备中.....
运动员Thread-1已经准备完毕,还有4个人正在准备中.....
运动员Thread-0已经准备完毕,还有3个人正在准备中.....
运动员Thread-2已经准备完毕,还有2个人正在准备中.....
运动员Thread-4已经准备完毕,还有1个人正在准备中.....
裁判:所有运动员准备完毕,开始跑,等待结果
运动员Thread-4到达终点,还有5个人在路上
运动员Thread-0到达终点,还有4个人在路上
运动员Thread-2到达终点,还有3个人在路上
运动员Thread-3到达终点,还有2个人在路上
运动员Thread-1到达终点,还有1个人在路上
裁判:跑步完毕,统计结果...

 

这样就能很方便的完成任务,当然这里并没有考虑实际的因素

 

比如在调用countDown的时候,要写到finally里面,不然如果出现异常信息,计数器不能减一,那么其他等待它的线程就会一直阻塞中,从而造成系统崩溃。

 

分享到:
评论

相关推荐

    JAVA多线程CountDownLatch使用详解

    JAVA多线程CountDownLatch使用详解 JAVA多线程CountDownLatch是JAVA多线程编程中的一种同步工具,主要用来让某个线程等待其他线程执行完毕后再继续执行。下面我们将详细介绍JAVA多线程CountDownLatch的使用和原理。...

    多线程countDownLatch方法介绍

    在Java多线程编程中,CountDownLatch是一个非常重要的同步工具类,它可以帮助我们协调多个线程之间的交互。本文将深入探讨CountDownLatch的工作原理、使用场景以及相关源码分析。 CountDownLatch是一个计数器,初始...

    java使用CountDownLatch等待多线程全部执行完成

    Java 使用 CountDownLatch 等待多线程全部执行完成 CountDownLatch 是 Java 中的一个同步工具类,允许一个或多个线程等待其他线程完成操作。它的应用场景非常广泛,例如在处理大量数据时,可以使用多线程的方式处理...

    汪文君JAVA多线程编程实战(完整不加密)

    《汪文君JAVA多线程编程实战》是一本专注于Java多线程编程的实战教程,由知名讲师汪文君倾力打造。这本书旨在帮助Java开发者深入理解和熟练掌握多线程编程技术,提升软件开发的效率和质量。在Java平台中,多线程是...

    java多线程进度条

    本主题将深入探讨如何在Java多线程环境下实现进度条功能。 首先,理解Java多线程的基本概念至关重要。Java通过Thread类和Runnable接口来支持多线程。创建一个新线程通常有两种方式:继承Thread类并重写run()方法,...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    Java多线程编程核心技术_完整版_java_

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁)

    MyBatis,作为一个优秀的Java持久层框架,提供了多种优化手段,其中包括多线程和批处理技术。本文将详细介绍如何利用MyBatis结合多线程和CountDownLatch闭锁来实现数据的批量插入。 首先,我们来看`mybatis批处理`...

    Java多线程编程实战指南-核心篇

    《Java多线程编程实战指南-核心篇》是一本深入探讨Java并发编程的书籍,旨在帮助读者掌握在Java环境中创建、管理和同步线程的核心技术。Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高...

    Java多线程设计模式_清晰完整PDF版 Java多线程设计模式源代码

    Java多线程设计模式是Java开发中的重要领域,它涉及到如何在并发环境下高效、安全地管理资源和控制程序执行流程。本资料集包含了清晰完整的PDF版书籍和源代码,为学习和理解Java多线程设计模式提供了丰富的素材。 ...

    如何使用CountDownLatch同步java多线程

    如何使用CountDownLatch同步java多线程 CountDownLatch 是 Java 并发编程中的一种常用工具,用于控制多个线程的并发执行。它可以实现多个线程之间的同步操作,使得线程之间可以协调工作,避免了线程之间的互相干扰...

    Java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过`Thread`类和并发工具来实现,接下来我们将深入探讨这些关键知识点。 1. **...

    Java多线程端口快速扫描

    Java多线程端口扫描是网络管理与安全领域中常用的一种技术,主要用于检测网络设备上哪些端口处于开放状态,从而分析网络的安全性或者优化网络配置。本程序通过利用Java的多线程特性,提高了扫描速度,使得在短时间内...

    JAVA多线程的实例

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应性。在Java中,实现多线程有两种主要方式:通过实现`Runnable`接口或者继承`Thread`类。 首先,让我们从创建线程开始。当你...

    java多线程示例

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应...文档“java多线程实例.docx”可能包含具体的示例代码和详细解释,建议参考学习,以加深对Java多线程的理解。

    java多线程进阶

    Java多线程是Java编程中的核心概念,尤其对于高级开发者来说,掌握多线程的深入理解和应用至关重要。这本书“java多线程进阶”显然旨在帮助读者深化这方面的理解,打通编程中的“任督二脉”,使开发者能够更加熟练地...

    java多线程加队列上传文件_后台处理

    ### Java多线程加队列上传文件_后台处理 #### 概述 本文将详细介绍一个基于Java实现的多线程文件上传系统,并结合队列管理技术来优化后台处理流程。该系统通过创建多个线程来并行处理客户端的文件上传请求,同时...

    java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程将深入探讨Java多线程的各个方面...

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    java多线程并发实战和源码

    Java多线程并发实战与源码分析是Java开发中至关重要的一部分,它涉及到程序性能优化、系统资源高效利用以及复杂逻辑的正确同步。本书主要聚焦于Java多线程的基础理论和实际应用,虽然书中实例和源码相对较少,但仍然...

Global site tag (gtag.js) - Google Analytics