作者H45 (!H45)
站内java
标题Re: [问题] thread的start
时间Sun Jun 15 11:20:26 2008
※ 引述《Domos (Domos)》之铭言:
: 如果我有一个比赛的程式,用两个thread去模拟
: 要怎麽让两个thread一起开始?
: 比如说 a.start();
: b.start();
: 搞不好a.start()之後比赛就结束了
再做一个鸣枪,让 a 和 b 去听这个枪声
听到之後再开跑。
========================================================
比赛者:
// 比赛者实作 Runnable 或过载 Thread 的 run 方法
public void run() {
等待枪声();
开始进行比赛();
}
世界:
Thread a = 取得比赛者("A");
Thread b = 取得比赛者("B");
a.start();
b.start();
鸣枪();
========================================================
我的想法是这样,至於要怎麽做嘛
以本人的程设能力可能不太适合当作良好范例,但是能动就是了
========================================================
// 目前等候中的选手数量,一开始为 0 人。
private static int state = 0;
public static void main(String[] args) throws Throwable {
final Object mutex = new Object();
// 选手要做的事情应该都差不多,此例为直接做同一份
Runnable runner = new Runnable() {
public void run() {
// 例外处理於此例为直接忽略
try {
synchronized (mutex) {
// 此选手已经开始等候啦!
// 增加等候中的选手数量。
state++;
// 等待枪声响起。
mutex.wait();
}
// 这位选手需要 1000 毫秒才能跑完全程
Thread.sleep(1000);
// 跑完之後和大家说你做到了!
System.out.println(Thread.currentThread().getName() + ": Job Finished.");
} catch (Exception e) {
// 忽略例外处理
e.printStackTrace();
}
}
};
// 创出 a, b 两位参赛者,分别叫作 "A" 和 "B"
Thread a = new Thread(runner, "A");
Thread b = new Thread(runner, "B");
// 请两位参赛者站上起跑点
a.start();
b.start();
// 确认是否已经有超过两位以上的参赛者就定位了
while (state < 2) {
Thread.yield();
}
synchronized (mutex) {
// 鸣枪!
mutex.notifyAll();
}
}
======================================================
实际测试显示,B 总是比 A 先跑完
以下是本程式的输出
B: Job Finished.
A: Job Finished.
不要问我为什麽会这样 =.=
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.116.247.13