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线程与并发实践编程 /美(jeff Friesen) 2017.2 java线程api和并发工具的实用指南
并发库高级应用\多线程\Java
java多线程与高并发java多线程与高并发java多线程与高并发
java jdk自带的线程并发框架使用帮助文档
代码里面包含一个并发4个线程同时运行 全部开始 全部停止 单个停止还有点问题。 还有生产者消费者 里面的里面能帮助你理解多线程的运用!
java多线程并发的在新窗口
JAVA多线程与并发学习总结.pdf
java线程并发库原子操作类与线程池的讲解,自我总结大家分享
Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java线程:新特征-锁(下) Java...
java线程与并发编程是java并发编程的盛典,绝对高清版
资源名称: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 线程系列博文总结word化,编目如下,欢迎互相学习交流: Java线程:概念与原理 Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:...
实现多线程的并发执行,能演示操作系统的时间转轮调度算法对多线程程序执行的影响效果,能控制一个或多个线程的执行情况。
第7章主要介绍了高并发框架Akka的基本使用方法,并使用Ak:ka框架实现了 个简单的粒子群算法, 模拟超高并发的场景。第8章介绍了使用Eclipse进行多线程调试的方法, 并演示了通过Eclipse进行多线程调试重现ArrayList...
这是一个关于java面试的技术文档,里面包含一个中等难度的面试编程题,主要覆盖的java技术范围是JAVA集合框架和多线程并发,文档中有题目的清晰描述并附有完整的实现代码,同时还包括相关技术点的解析,适合java求职...