`
sd_zyl
  • 浏览: 43217 次
  • 性别: 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 模拟线程并发

    Java 模拟线程并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发 Java, 模拟线程并发,线程,并发

    java线程与并发编程实践

    java线程与并发实践编程 /美(jeff Friesen) 2017.2 java线程api和并发工具的实用指南

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

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

    java多线程与高并发视频

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

    java自带并发框架

    java jdk自带的线程并发框架使用帮助文档

    java 多线程并发实例

    代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!

    java多线程并发

    java多线程并发的在新窗口

    JAVA多线程与并发学习总结.pdf

    JAVA多线程与并发学习总结.pdf

    java线程并发库ppt

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

    java多线程编程总结

    Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...

    java线程与并发编程

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

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

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

    Java 并发性和多线程

    Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程Java 并发性和多线程

    java多线程和并发

    java多线程和并发 java多线程和并发 java多线程和并发 java多线程和并发 java多线程和并发 java多线程和并发

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

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

    Java线程讲解Java线程讲解

    Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解Java线程讲解

    Java多线程编程总结

    Java 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...

    java多线程并发演示

    实现多线程的并发执行,能演示操作系统的时间转轮调度算法对多线程程序执行的影响效果,能控制一个或多个线程的执行情况。

    Java高并发实战_java高并发_高并发_

    第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高并发的场景。第8章介绍了使用Eclipse进行多线程调试的方法, 并演示了通过Eclipse进行多线程调试重现ArrayList...

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

    这是一个关于java面试的技术文档,里面包含一个中等难度的面试编程题,主要覆盖的java技术范围是JAVA集合框架和多线程并发,文档中有题目的清晰描述并附有完整的实现代码,同时还包括相关技术点的解析,适合java求职...

Global site tag (gtag.js) - Google Analytics