`
zhoujiangzi
  • 浏览: 91442 次
  • 性别: 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等待多线程全部执行完成

    主要为大家详细介绍了使用CountDownLatch等待多线程全部执行完成,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

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

    mybaits 多线程 实现数据批量插入 (运用CountDownLatch实现闭锁) 1、mybatis批处理 2、数据分批量查询 3、数据分批量插入

    Java多线程编程之CountDownLatch同步工具使用实例

    主要介绍了Java多线程编程之CountDownLatch同步工具使用实例,需要的朋友可以参考下

    详解Java多线程编程中CountDownLatch阻塞线程的方法

    在Java中和ReadWriteLock.ReadLock一样,CountDownLatch的本质也是一个"共享锁",这里我们就来详解Java多线程编程中CountDownLatch阻塞线程的方法:

    Java多线程之并发工具类

     1)CountDownLatch(同步倒数计数器:等待多线程(或者多步骤)完成)  2)CyclicBarrier(循环屏障:同步屏障)  3)Semaphore(信号量:控制并发进程数)  主要参考资料:java并发编程的艺术、Java并发——...

    Java中的CountDownLatch类最全讲义

    实现多线程任务的同步 3.1 场景介绍 3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 ...

    如何使用CountDownLatch同步java多线程

    主要介绍了如何使用CountDownLatch同步java多线程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    个人总结的深入java多线程开发

    看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...

    2023年最新Java高并发多线程面试题

    适用人群:适合想了解或学习高并发多线程的 IT 学生、开发人员、研究人员以及使用Java多线程进行开发的任何人。 能学到什么:常见Java高并发多线程面试问题及在相关场景下如何处理和解决这些问题。 阅读建议:通过...

    详解java多线程的同步控制

    目录线程安全 Thread Safety重入锁 ReentrantLock读写锁 ReadWriteLock倒计数器 CountDownLatch循环栅栏 CyclicBarrier信号量 Semaphore 线程安全 Thread Safety JMM JMM(Java Memory Model)是一种基于计算机内存...

    基础技术部牛路《Java多线程入阶分享》纯干货

    Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和Future 3.阻塞队列:put和take、offer和poll、drainTo 4.线程间通信:lock、condition、wait、notify...

    Java中CountDownLatch进行多线程同步详解及实例代码

    主要介绍了Java中CountDownLatch进行多线程同步详解及实例代码的相关资料,需要的朋友可以参考下

    Java中多线程同步类 CountDownLatch

    本篇文章主要介绍了Java中多线程同步类 CountDownLatch的相关知识,具有很好的参考价值。下面跟着小编一起来看下吧

    Java concurrency之CountDownLatch原理和示例_动力节点Java学院整理

    CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 下面通过本文给大家分享Java concurrency之CountDownLatch原理和示例,需要的的朋友参考下吧

    Java并发编程一CountDownLatch、CyclicBarrier、Semaphore初使用

    CountDownLatch可以实现一个线程等待多个线程、多个线程等待一个线程、多个线程等待多个线程(这里不涉及)。 我们首先来看看怎么实现一个线程等待多个线程吧。 工厂中,对产品需要进行质检,5个工人进行检查,所有...

    JAVA多线程技术分享-39页PPT(winding)

    分享的多线程技术不是告诉你什么是线程,线程的状态,而是我们在开发中容易踩的坑,受过的伤害。我不会告诉你什么是爱情,但是我会告诉你爱过。 一 基础: 1,Thread.sleep(0)的作用 2,为什么线程会带来性能问题 3...

    Java多线程同步器代码详解

    主要介绍了Java多线程同步器代码详解,文章分别介绍了是CountDownLatch,Semaphore,Barrier和Exchanger以及其相关代码示例,具有一定参考价值,需要的朋友可以了解下。

    java大批量导入excel,多线程加分片处理的dome

    importExcel 方法接收一个 Excel 文件对象、批大小 batchSize 和线程数 threadCount 作为参数。首先,使用 ExcelReader 对象读取 Excel 文件,并计算出总行数和分片大小和数量;然后,创建一个固定数量的线程池,...

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

Global site tag (gtag.js) - Google Analytics