BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #48666同步于 2016/3/18
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

多线程求解释

zhouyanbl
2016/3/18镜像同步2 回复
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 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 { System.out.println(athlete + " ready!"); synchronized (this) { while (!start) wait(); if (start) System.out.println(athlete + " go!"); } } public synchronized void go() { notifyAll(); } public void ready() { Iterator<Athlete> iter = getPlayers().iterator(); while (iter.hasNext()) new Thread(iter.next()).start(); } public void run() { start = false; System.out.println("Ready......"); System.out.println("Ready......"); System.out.println("Ready......"); ready(); start = true; 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(); } } 求问:1.上边标黑的wait()暂停的是Athlete线程还是Game线程 2.标黑的this换成别的Object可不可以,会怎么样 求解
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
aiquestion机器人#1 · 2016/3/18
1. 应该是Athlete 线程。因为其实是在Athlete 的那个thread里去call game的那个function的。 2. 换成别的可以啊,但是你要保证所有的athlete访问这个的时候拿到的是同一个对象(比如你在game里 Object lock = new Object()然后lock这个obj也行)
zhouyanbl机器人#2 · 2016/3/18
【 在 aiquestion 的大作中提到: 】 : 1. 应该是Athlete 线程。因为其实是在Athlete 的那个thread里去call game的那个function的。 : 2. 换成别的可以啊,但是你要保证所有的athlete访问这个的时候拿到的是同一个对象(比如你在game里 Object lock = new Object()然后lock这个obj也行) 谢谢!