`

并发同步器 CountDownLatch的用法

阅读更多
CountDownlatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待,此场景适用在完成所有任务之后才能继续下面的任务的场景 比如下面田径运动员 只有运动员全部跑完比赛才能 进行下面的成绩统计
import java.util.Arrays;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 
 * CountDownLatch类是一个同步计数器,构造时传入int参数,该参数就是计数器的初始值,
 * 每调用一次countDown()方法,计数器减1,计数器大于0 时,await()方法会阻塞程序继续执行
 *
 */
public class CountDownLatchTest1 {
 private  final static int NUM=6;//6个运动员
 	public static void main(String[] args) {
	 CountDownLatch begin=new CountDownLatch(1);
	 CountDownLatch end =new CountDownLatch(NUM);
	 Player[] players=new Player[NUM];
	 for(int i=0;i<NUM;i++)
	    	 players[i]=new Player("aa"+(i+1), begin, end);
	 StatisticScore t=new StatisticScore(players);
	 ExecutorService  excutorService=Executors.newFixedThreadPool(NUM);
	 for(Player p:players)
		 excutorService.execute(p);
	 // 比赛开始
	 begin.countDown();
	 try {
		end.await();
	 } catch (InterruptedException e) {
		 e.printStackTrace();
	 }
	 excutorService.shutdown();
	 //开始统计成绩
	 t.start();
  }
}

接下来是田径运动员
/**
 * 田径运动员
 *
 */

class Player extends Thread implements Comparable<Player>{
	//成绩 
	private int score;
	//名字
	private String name;
	//开始同步计时器
	private CountDownLatch begin;
	//结束同步计时器
	private CountDownLatch end;
	
	public Player(String name,CountDownLatch begin,CountDownLatch end) {
	   this.name=name;
	   this.begin=begin;
	   this.end=end;
	}
	@Override
	public void run() {
	   //
		try {
			//等待口令准备开始
			begin.await();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		try {
			//开始运动
			System.out.println("运动员["+name+"] 开始跑");
			int n=(int) (Math.random()*50);
			Thread.sleep(n);
			//运动结束
			//成绩为
			score=n;
			System.out.println("运动员["+name+"] 跑完,成绩:"+score+"s");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		end.countDown();
	}
	@Override
	public int compareTo(Player o) {
		return score-o.getScore();
	}
	public int getScore() {
		return score;
	}
	public String getPlayerName(){
		return name;
	}
}


下面是成绩统计类
/**
 * 成绩统计
 */
class StatisticScore extends Thread{
	Player[] players;
	
	public StatisticScore(Player[] players) {
		this.players=players;
	}
	@Override
	public void run() {
		System.out.println("成绩统计排行榜如下:");
	  Arrays.sort(players);//成绩排名
	  for(int i=0;i<players.length;i++){
		  System.out.println("运动员["+players[i].getPlayerName()+"] 第"+(i+1)+"名 成绩:"+players[i].getScore()+"s");
	  }
	}
}

最终运行结果
运动员[aa2] 开始跑
运动员[aa4] 开始跑
运动员[aa5] 开始跑
运动员[aa1] 开始跑
运动员[aa3] 开始跑
运动员[aa6] 开始跑
运动员[aa6] 跑完,成绩:3s
运动员[aa5] 跑完,成绩:5s
运动员[aa4] 跑完,成绩:14s
运动员[aa1] 跑完,成绩:31s
运动员[aa2] 跑完,成绩:33s
运动员[aa3] 跑完,成绩:49s
成绩统计排行榜如下:
运动员[aa6] 第1名 成绩:3s
运动员[aa5] 第2名 成绩:5s
运动员[aa4] 第3名 成绩:14s
运动员[aa1] 第4名 成绩:31s
运动员[aa2] 第5名 成绩:33s
运动员[aa3] 第6名 成绩:49s
分享到:
评论

相关推荐

    java并发编程之同步器代码示例

    Java并发编程之同步器代码示例 ...Java并发编程之同步器代码示例展示了Java中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。

    java分布式应用学习笔记05多线程下的并发同步器.pdf

    并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是...

    第20章 Part4 并发工具同步器.pdf

    ### 第20章 Part4 并发工具同步器 #### 主要内容概述 本章节主要介绍了Java中的并发工具,特别是同步器的相关概念和技术。这部分内容是构建高效、可靠的并发应用程序的基础,尤其对于需要处理大量并发任务的应用...

    浅谈java并发之计数器CountDownLatch

    AQS是一个用于构建锁和同步器的框架,提供了线程之间的同步和队列管理。Sync类中的构造函数接收一个初始计数值,并将其设置为AQS的状态(getState() 和 setState() 方法)。tryAcquireShared() 和 tryReleaseShared...

    CountDownLatch、Semaphore等4大并发工具类详解

    本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...

    Java并发编程:CountDownLatch与CyclicBarrier和Semaphore的实例详解

    一、CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。它可以让一个线程等待其他线程执行完毕后再执行。CountDownLatch类只提供了一个构造器:public ...

    Java中的CountDownLatch类最全讲义

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

    《java 并发编程实战高清PDF版》

    其中包括`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`CountDownLatch`(倒计时器)用于一次性阻塞多个线程,直到某个事件发生,以及`CyclicBarrier`(循环栅栏)让一组线程等待其他线程到达特定点后...

    Java并发工具包

    五、同步器 Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)。它们帮助协调多线程间的协作,控制线程的并发访问数量或等待特定条件。 六...

    JAVA并发编程艺术pdf版

    - **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时器)和ExecutorService(线程池)等。 - **Future和Callable**:Future接口...

    27 倒数计时开始,三、二、一—CountDownLatch详解.pdf

    CountDownLatch 的实现基于 `AbstractQueuedSynchronizer`(AQS)框架,这是一个内置的锁和同步器框架。AQS 内部维护了一个整型状态变量 `state`,在 CountDownLatch 中,`state` 代表计数值。`countDown()` 方法...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...

    实战Java高并发程序设计模式

    Java并发库提供了一些高级工具,如并发容器(ConcurrentHashMap、CopyOnWriteArrayList等)、并发工具类(CountDownLatch、CyclicBarrier、Semaphore)以及Fork/Join框架,这些都能帮助我们编写出高性能的并发代码。...

    java并发编程实战高清版pdf

    6. **并发工具类**:`java.util.concurrent`包提供了许多实用的并发工具类,如`ExecutorService`用于管理线程池,`CountDownLatch`和`CyclicBarrier`用于协调多线程间的同步。 7. **并发模式与设计原则**:了解如何...

    CountDownLatch 和 CyclicBarrier 的运用(含AQS详解)

    AQS 定义了一个抽象的同步器框架,CountDownLatch 内部实现了 AQS 的 `tryAcquireShared()` 和 `tryReleaseShared()` 方法,通过这些方法来控制线程的等待和释放。 #### CyclicBarrier **定义与特点:** ...

    The java.util.concurrent synchronizer framework.pdf

    文档标题“java.util.concurrent同步器框架”和描述“Doug Lea的java.util.concurrent同步器框架”表明本文将探讨由Doug Lea所撰写的关于Java并发编程中同步器框架的内容。文档中提到了AbstractQueuedSynchronizer类...

    JAVA并发编程与高并发解决方案 JAVA高并发项目实战课程

    `CountDownLatch`是一个同步工具类,用于等待一组操作完成。它被广泛应用于等待多个线程完成某个任务后再继续执行后续逻辑。 - **示例代码**: ```java CountDownLatch latch = new CountDownLatch(3); for (int ...

    Java并发编程全景图.pdf

    8. 锁和同步器 锁是实现线程同步的关键机制,Java提供了不同类型的锁,包括乐观锁、悲观锁、自旋锁等。自旋锁利用了CPU空转等待,减少了线程上下文切换的开销。公平锁和非公平锁的区别在于线程获取锁的顺序。读写锁...

    Java 并发核心编程

    - **解决方法**: 使用适当的同步策略(如`synchronized`、`volatile`或锁)。 6. **Safe Publications**: - **问题**: 如果在对象创建完成之前就将其引用发布出去,可能会导致其他线程看到尚未完全初始化的对象。...

    Java 并发编程实战 中英文+代码示例

    3. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和Exchanger(交换器)等,这些都是Java并发库提供的重要工具,用于实现复杂的同步和协作机制。 4. **并发集合**...

Global site tag (gtag.js) - Google Analytics