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中的同步器机制,包括CountDownLatch、Semaphore、Barrier和Exchanger队列同步器等,帮助开发者更好地理解和使用Java中的并发编程技术。
并发同步器在多线程编程中起到协调各个线程访问共享资源,确保数据一致性与程序正确性的关键作用。本篇笔记将深入探讨Java中的并发同步机制,包括核心概念、工具类以及在实际开发中的应用。 首先,我们要理解什么是...
### 第20章 Part4 并发工具同步器 #### 主要内容概述 本章节主要介绍了Java中的并发工具,特别是同步器的相关概念和技术。这部分内容是构建高效、可靠的并发应用程序的基础,尤其对于需要处理大量并发任务的应用...
AQS是一个用于构建锁和同步器的框架,提供了线程之间的同步和队列管理。Sync类中的构造函数接收一个初始计数值,并将其设置为AQS的状态(getState() 和 setState() 方法)。tryAcquireShared() 和 tryReleaseShared...
本文将详细介绍 Java 并发工具类的四大类:CountDownLatch、Semaphore、CyclicBarrier 和 Phaser,及其应用场景和使用方法。 CountDownLatch CountDownLatch 是一个同步的辅助类,允许一个或多个线程,等待其他一...
一、CountDownLatch用法 CountDownLatch类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。它可以让一个线程等待其他线程执行完毕后再执行。CountDownLatch类只提供了一个构造器:public ...
3.2 使用CountDownLatch实现同步 主线程等待多个线程完成 4.1 场景介绍 4.2 使用CountDownLatch实现等待 CountDownLatch的其他应用场景 5.1 倒计时计时器 5.2 同时开始任务 5.3 等待多个资源就绪 CountDownLatch与...
其中包括`Semaphore`(信号量)用于限制同时访问特定资源的线程数量,`CountDownLatch`(倒计时器)用于一次性阻塞多个线程,直到某个事件发生,以及`CyclicBarrier`(循环栅栏)让一组线程等待其他线程到达特定点后...
五、同步器 Java并发工具包中包含了一些同步辅助类,如Semaphore(信号量)、CyclicBarrier(循环屏障)和CountDownLatch(计数器门锁)。它们帮助协调多线程间的协作,控制线程的并发访问数量或等待特定条件。 六...
- **java.util.concurrent** 包:提供了各种并发工具类,如Semaphore(信号量)、CyclicBarrier(循环屏障)、CountDownLatch(倒计时器)和ExecutorService(线程池)等。 - **Future和Callable**:Future接口...
CountDownLatch 的实现基于 `AbstractQueuedSynchronizer`(AQS)框架,这是一个内置的锁和同步器框架。AQS 内部维护了一个整型状态变量 `state`,在 CountDownLatch 中,`state` 代表计数值。`countDown()` 方法...
Java并发库提供了一些高级工具,如并发容器(ConcurrentHashMap、CopyOnWriteArrayList等)、并发工具类(CountDownLatch、CyclicBarrier、Semaphore)以及Fork/Join框架,这些都能帮助我们编写出高性能的并发代码。...
6. **并发工具类**:`java.util.concurrent`包提供了许多实用的并发工具类,如`ExecutorService`用于管理线程池,`CountDownLatch`和`CyclicBarrier`用于协调多线程间的同步。 7. **并发模式与设计原则**:了解如何...
AQS 定义了一个抽象的同步器框架,CountDownLatch 内部实现了 AQS 的 `tryAcquireShared()` 和 `tryReleaseShared()` 方法,通过这些方法来控制线程的等待和释放。 #### CyclicBarrier **定义与特点:** ...
文档标题“java.util.concurrent同步器框架”和描述“Doug Lea的java.util.concurrent同步器框架”表明本文将探讨由Doug Lea所撰写的关于Java并发编程中同步器框架的内容。文档中提到了AbstractQueuedSynchronizer类...
`CountDownLatch`是一个同步工具类,用于等待一组操作完成。它被广泛应用于等待多个线程完成某个任务后再继续执行后续逻辑。 - **示例代码**: ```java CountDownLatch latch = new CountDownLatch(3); for (int ...
8. 锁和同步器 锁是实现线程同步的关键机制,Java提供了不同类型的锁,包括乐观锁、悲观锁、自旋锁等。自旋锁利用了CPU空转等待,减少了线程上下文切换的开销。公平锁和非公平锁的区别在于线程获取锁的顺序。读写锁...
- **解决方法**: 使用适当的同步策略(如`synchronized`、`volatile`或锁)。 6. **Safe Publications**: - **问题**: 如果在对象创建完成之前就将其引用发布出去,可能会导致其他线程看到尚未完全初始化的对象。...
│ 高并发编程第一阶段20讲、同步代码块以及同步方法之间的区别和关系.mp4 │ 高并发编程第一阶段21讲、通过实验分析This锁的存在.mp4 │ 高并发编程第一阶段22讲、通过实验分析Class锁的存在.mp4 │ 高并发编程...
3. **并发工具类**:如Semaphore(信号量)、CountDownLatch(计数器)、CyclicBarrier(回环栅栏)和Exchanger(交换器)等,这些都是Java并发库提供的重要工具,用于实现复杂的同步和协作机制。 4. **并发集合**...