Re: [問題] thread的start

看板java作者 (!H45)時間17年前 (2008/06/15 11:20), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/5 (看更多)
※ 引述《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
文章代碼(AID): #18L8fxgR (java)
討論串 (同標題文章)
文章代碼(AID): #18L8fxgR (java)