Re: [問題] thread的start
※ 引述《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
討論串 (同標題文章)