`
sd_zyl
  • 浏览: 44284 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java线程协助以及并发框架模拟运动员跑步比赛

阅读更多
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模拟实现跑步比赛.rar

    - 模拟比赛过程需要实现一定的逻辑,例如,当比赛开始时,所有选手开始跑步,他们的位置根据速度和时间进行更新。 - 可能需要使用线程或异步处理来模拟并发,让每个选手的运动独立进行。 - 在比赛中,可能有选手...

    java线程与并发编程实践

    在《java线程与并发实践编程》中,作者Jeff Friesen可能还会深入讨论线程池的配置策略、死锁和活锁的预防、线程性能分析与调优,以及Java内存模型(JMM)和线程通信模型(如wait()、notify()、notifyAll())等内容。...

    java 多线程并发实例

    在Java编程中,多线程并发是...总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程控制、同步机制以及经典的设计模式,提升我们的编程能力。通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。

    Java多线程与并发库高级应用

    并发库高级应用\多线程\Java

    java多线程与高并发视频

    java多线程与高并发java多线程与高并发java多线程与高并发

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    java自带并发框架

    Java并发框架是Java JDK中内置的一系列用于处理多线程并行执行的工具和类库,自JDK 5.0引入以来,极大地简化了并发编程的复杂性。这个框架由Doug Lea设计,并在JSR-166任务中提出,最终在Tiger(JDK 5)版本中被引入...

    java多线程并发

    java多线程并发的在新窗口

    java多线程和并发.pdf

    Java多线程与并发编程是Java语言中用于处理多任务执行的关键技术,它能够帮助开发者设计出能够有效应对高并发请求的应用程序。在现代的线上(Online)和离线(Offline)应用中,合理利用多线程技术可以大幅提高系统...

    java多线程并发及集合框架面试题

    面试中,Java 集合框架和多线程并发是常见的话题,因为它们是构建可扩展和健壮应用的基础。本题旨在考察候选人在实际并发场景下对 HashMap 和 ConcurrentHashMap 的理解和应用。 HashMap 和 ConcurrentHashMap 的...

    java线程并发库ppt

    java线程并发库原子操作类与线程池的讲解,自我总结大家分享

    多线程,高并发.zip

    在IT领域,多线程和高并发是两个关键概念,特别是在Java编程中,它们对于构建高效、可扩展的系统至关重要。下面将详细解释这两个概念及其在Java中的实现和应用。 多线程是指在一个应用程序中同时运行多个独立的执行...

    实现Java高并发隔离 模拟

    在文档“高并发隔离.docx”中,可能详细介绍了如何构建一个模拟环境,包括如何设置线程池大小,如何构造并发任务,以及如何使用并发工具类实现数据隔离。此外,它还可能涉及如何分析和优化并发性能,比如通过调整锁...

    基于Java的多线程并发编程框架gobrs-async设计源码

    该项目是采用Java编写的gobrs-async多线程并发编程框架的源码,总计包含445个文件,涵盖了242个Java源文件、47个Markdown文档、36个PNG图片、36个Vue组件、20个JavaScript文件、14个XML配置文件、13个Stylus样式表、...

    java线程与并发编程

    java线程与并发编程是java并发编程的盛典,绝对高清版

    Java多线程与并发库高级应用视频教程22集

    资源名称:Java多线程与并发库高级应用视频教程22集资源目录:【】01传统线程技术回顾【】02传统定时器技术回顾【】03传统线程互斥技术【】04传统线程同步通信技术【】04传统线程同步通信技术_分割纪录【】05线程...

    黑马程序员_张孝祥_Java多线程与并发库 视频+代码+资料

    根据给定文件的信息,我们可以提炼出以下关于Java多线程与并发库的相关知识点: ### Java多线程基础 1. **线程的概念**:在Java中,线程是程序执行流的基本单元。一个标准的Java应用程序至少有一个线程,即主...

    java socket 多线程并发控制 hibernate mysql

    本项目聚焦于使用Java的Socket进行多线程并发控制,并结合Hibernate ORM框架与MySQL数据库进行数据存储。下面将详细阐述这些技术及其应用。 首先,Java Socket是Java提供的用于实现网络上不同计算机间进程通信的...

    Java 多线程与并发编程总结.doc

    Java多线程与并发编程是Java...总之,Java多线程与并发编程是Java程序员必须掌握的核心技能,它涉及到操作系统原理、JVM内部机制以及Java提供的各种并发工具,熟练掌握这些知识对于编写高效、稳定的并发程序至关重要。

    笔记_张孝祥_Java多线程与并发库高级应用

    张孝祥Java多线程与并发库高级应用学习笔记,很经典的学习多线程和并发的资料。张孝祥Java多线程讲义笔记由张孝祥亲自整理,很实用的。

Global site tag (gtag.js) - Google Analytics