单个线程唤醒多个线程的经典例子(加入了注释)
2013-04-18 15:32
363 查看
原文出处:/article/4381735.html
比赛类:
运动员类:
比赛类:
package deng; import java.util.Collection; import java.util.Collections; import java.util.HashSet; import java.util.Iterator; import java.util.Set; /* * 模拟线程之间的协作。 * Game类有2个同步方法prepare()和go()。 * 标志位start用于判断当前线程是否需要wait()。 * Game类的实例首先启动所有的Athele类实例,使其进入wait()状态, * 在一段时间后,改变标志位并notifyAll()所有处于wait状态的Athele线程。 */ 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); } /* * start为false即比赛没有开始, * 运动员进入就绪状态 */ public void prepare(Athlete athlete) throws InterruptedException { System.out.println(athlete.toString() + " ready!"); synchronized (this) { while (!start) wait();//NotifyAll时,start已经为true,即比赛已经开始 if (start)//各运动员开始比赛 System.out.println(athlete + " go!"); } } public synchronized void go() { notifyAll(); } /* * 开启Iterator中所有运动员线程 * 让所有的运动员进入就绪待跑状态 */ 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(); //准备10个运动员线程 for (int i = 0; i < 10; i++) game.addPlayer(new Athlete(i, game)); //开始比赛 new Thread(game).start(); } }
运动员类:
package deng; 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"); } } }
相关文章推荐
- Java_线程—经典的例子:售票
- Windows 窗体编程 如何:使用后台线程搜索文件 (线程经典例子)
- Java线程学习经典例子-读写者演示
- Java线程学习经典例子-读写者演示
- 修改例子,TCP服务器和客户端,加入线程的概念,实现单方多次发送信息
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- JavaScript异步和单线程经典的例子setTimeout
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- Java线程学习经典例子-读写者演示
- 自制简单的Java下载器——来自《Java高级编程》的一个关于线程的例子(带上部分注释)
- 经典的线程协作例子
- Java_线程—经典的例子:生产者和消费者
- TensorFlow 一个线程回归的例子
- 递推的几个经典例子
- 线程小例子
- 在Java的Condition接口【唤醒全部线程】
- android背景图片更换——经典例子
- C# 中子线程控制进度条的一个简单例子
- 学习和理解JAVA线程同步--生产者与消费者例子
- String类的经典例子