java多线程版本:
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Athlete implements Runnable {
private final int id;
private Game game;
public Athlete(int id, Game game) {
this.id = id;
this.game = game;
}
public boolean equals(Object o) {
if (!(o instanceof Athlete))
return false;
Athlete athlete = (Athlete) o;
return id == athlete.id;
}
public String toString() {
return "Athlete<" + id + ">";
}
public int hashCode() {
return new Integer(id).hashCode();
}
public void run() {
try {
game.prepare(this);
} catch (InterruptedException e) {
System.out.println(this + " quit the game");
}
}
}
public class Game implements Runnable {
private Set<Athlete> players = new HashSet<Athlete>();
private boolean start = false;
public synchronized boolean isStart() {
return start;
}
public synchronized void setStart(boolean start) {
this.start = start;
}
public void addPlayer(Athlete one) {
players.add(one);
}
public void removePlayer(Athlete one) {
players.remove(one);
}
public Collection<Athlete> getPlayers() {
return Collections.unmodifiableSet(players);
}
public void prepare(Athlete athlete) throws InterruptedException {
synchronized (this) {
System.out.println(athlete + " ready!");//报告准备完毕...
while (!isStart()) {//阻塞条件不满足,就保持阻塞状态,就等开启条件,然后唤醒,唤醒就开始跑
System.out.println(athlete + " isStart=false");
wait();
}
}
System.out.println(athlete + " go!");//唤醒就跑
}
public void go() {
setStart(true);//改变条件,一旦线程唤醒就可以跑了...
synchronized (this) {
//唤醒所有的阻塞线程,开始跑...
//注意不能使用notify(),notify只能唤醒一个线程
notifyAll();
}
}
public void ready() {
setStart(false);
Iterator<Athlete> iter = getPlayers().iterator();
while (iter.hasNext()) {
new Thread(iter.next()).start();
}
}
public void run() {
System.out.println("Ready......");
//口令:预备...
ready();
try {
Thread.sleep(100L);//给一点时间,运动员动作准备就绪...
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Go!!!");
//口令:跑...
go();
}
public static void main(String[] args) {
Game game = new Game();
for (int i = 0; i < 10; i++) {
game.addPlayer(new Athlete(i, game));
}
new Thread(game).start();
}
}
java并发包改写版本:
class Athlete implements Runnable {
private final int id;
private CountDownLatch countDown;
public Athlete(int id, CountDownLatch countDown) {
this.id = id;
this.countDown = countDown;
}
public boolean equals(Object o) {
if (!(o instanceof Athlete))
return false;
Athlete athlete = (Athlete) o;
return id == athlete.id;
}
public String toString() {
return "Athlete<" + id + ">";
}
public int hashCode() {
return new Integer(id).hashCode();
}
public void run() {
try {
System.out.println(this + " ready");//报告准备就绪
countDown.await();//阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(this + " go~~~"); //开始跑...
}
}
public class CountDownLatchGame {
private static CountDownLatch countDown = new CountDownLatch(1);
public static void main(String[] args) {
ExecutorService exe = Executors.newFixedThreadPool(10);
System.out.println("Ready!!!!");
for(int i=0;i<10;i++) {
exe.execute(new Athlete(i+1, countDown));
}
try {
Thread.sleep(200L);//给一点时间,运动员动作准备就绪...
System.out.println("Go!");
countDown.countDown();//命令:跑...
Thread.sleep(300L);
} catch (InterruptedException e) {
e.printStackTrace();
}
//执行完毕
exe.shutdown();
}
}
分享到:
相关推荐
- 模拟比赛过程需要实现一定的逻辑,例如,当比赛开始时,所有选手开始跑步,他们的位置根据速度和时间进行更新。 - 可能需要使用线程或异步处理来模拟并发,让每个选手的运动独立进行。 - 在比赛中,可能有选手...
在《java线程与并发实践编程》中,作者Jeff Friesen可能还会深入讨论线程池的配置策略、死锁和活锁的预防、线程性能分析与调优,以及Java内存模型(JMM)和线程通信模型(如wait()、notify()、notifyAll())等内容。...
在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。
并发库高级应用\多线程\Java
java多线程与高并发java多线程与高并发java多线程与高并发
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java并发框架是Java JDK中内置的一系列用于处理多线程并行执行的工具和类库,自JDK 5.0引入以来,极大地简化了并发编程的复杂性。这个框架由Doug Lea设计,并在JSR-166任务中提出,最终在Tiger(JDK 5)版本中被引入...
java多线程并发的在新窗口
Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...
面试中,Java 集合框架和多线程并发是常见的话题,因为它们是构建可扩展和健壮应用的基础。本题旨在考察候选人在实际并发场景下对 HashMap 和 ConcurrentHashMap 的理解和应用。 HashMap 和 ConcurrentHashMap 的...
java线程并发库原子操作类与线程池的讲解,自我总结大家分享
在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...
在文档“高并发隔离.docx”中,可能详细介绍了如何构建一个模拟环境,包括如何设置线程池大小,如何构造并发任务,以及如何使用并发工具类实现数据隔离。此外,它还可能涉及如何分析和优化并发性能,比如通过调整锁...
该项目是采用Java编写的gobrs-async多线程并发编程框架的源码,总计包含445个文件,涵盖了242个Java源文件、47个Markdown文档、36个PNG图片、36个Vue组件、20个JavaScript文件、14个XML配置文件、13个Stylus样式表、...
java线程与并发编程是java并发编程的盛典,绝对高清版
资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...
根据给定文件的信息,我们可以提炼出以下关于Java多线程与并发库的相关知识点: ### Java多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...
本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...
Java多线程与并发编程是Java...总之,Java多线程与并发编程是Java程序员必须掌握的核心技能,它涉及到操作系统原理、JVM内部机制以及Java提供的各种并发工具,熟练掌握这些知识对于编写高效、稳定的并发程序至关重要。
张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。