模拟两个线程之间的协作。
Athele
类有两个同步方法
prepare()
和
go()
。标志位
start
用于判断当前线程是否需要
wait()
。
Referee
类的实例首先启动所有的
Athele
类实例,使其进入
wait()
状态,在一段时间后,改变标志位并
notifyAll()
所有处于
wait
状态的
Athele
线程。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
import java.util.concurrent.TimeUnit;
class Athlete implements Runnable {
private boolean start = false;
private final int id;
public Athlete(int id) {
this.id = id;
}
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 synchronized void prepare() throws InterruptedException {
System.out.println(this + " ready!");
while (start == false)
wait();
if (start == true)
System.out.println(this + " go!");
}
public synchronized void go() {
start = true;
notifyAll();
}
public void run() {
try {
prepare();
} catch (InterruptedException e) {
//maybe should notify the referee
System.out.println(this+" quit the game");
}
}
}
class Referee implements Runnable {
private Set<Athlete> players = new HashSet<Athlete>();
public void addPlayer(Athlete one) {
players.add(one);
}
public void removePlayer(Athlete one) {
players.remove(one);
}
public void ready() {
Iterator<Athlete> iter = players.iterator();
while (iter.hasNext())
new Thread(iter.next()).start();
}
public void action() {
Iterator<Athlete> iter = players.iterator();
while (iter.hasNext())
iter.next().go();
}
public void run() {
ready();
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
action();
}
}
public class Game {
public static void main(String[] args) {
Referee referee = new Referee();
for (int i = 0; i < 10; i++)
referee.addPlayer(new Athlete(i));
new Thread(referee).start();
}
}
分享到:
相关推荐
Java多线程的等待唤醒机制代码演示 通过代码,完整的还原消费者和生产者的等待唤醒过程...- void wait() 当前线程等待,直到被其他线程唤醒 - void notify() 随机唤醒单个线程 - void notifyAll() 唤醒所有线程
多线程间通信,其实是多个线程操操作同一个资源,但是操作方式不同。典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。 1、相关API介绍 public final void notify() 唤醒在此对象监视...
1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。...47.当一个线程进入一个对象的一个synchronized方法后,其它线程是否可...
实例119 在指定的目录下创建多个临时文件 158 实例120 删除指定目录下的文件 160 实例121 移动指定目录下的文件 163 实例122 文件搜索引挚 167 7.2 字节流 169 实例123 复制指定目录下的文件 170 ...
实例119 在指定的目录下创建多个临时文件 158 实例120 删除指定目录下的文件 160 实例121 移动指定目录下的文件 163 实例122 文件搜索引挚 167 7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 显示文件中...
实例119 在指定的目录下创建多个临时文件 158 实例120 删除指定目录下的文件 160 实例121 移动指定目录下的文件 163 实例122 文件搜索引挚 167 7.2 字节流 169 实例123 复制指定目录下的文件 ...
实例119 在指定的目录下创建多个临时文件 158 实例120 删除指定目录下的文件 160 实例121 移动指定目录下的文件 163 实例122 文件搜索引挚 167 7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 显示文件中...
实例119 在指定的目录下创建多个临时文件 158 实例120 删除指定目录下的文件 160 实例121 移动指定目录下的文件 163 实例122 文件搜索引挚 167 7.2 字节流 169 实例123 复制指定目录下的文件 170 实例124 ...
它已经在多线程和MPI C / C ++应用程序上进行了测试。 。 该存储库是一个富有想象力的修改版本(通用自动并行概要分析器-),并在2018-2019年作为我硕士项目的一部分进行开发。 GAPP由帝国理工学院的Reena Nair和...
第 1 章 限制对服务器资源的访问 第 2 章 镜像数据库设备 第 3 章 配置内存 第 4 章 配置数据高速缓存 第 5 章 管理多处理器服务器 第 6 章 创建和管理用户数据库 第 7 章 装入和卸下数据库 第 8 章 分布式事务管理 ...