2012-02-23 45 views
0

我在java中的線程有點麻煩。基本上我創建一個線程數組並啓動它們。該計劃的重點是模擬比賽,爲每個參賽者(即每個線程)總計時間並挑選獲勝者。線程的一些問題

競爭對手移動一個空間,等待(即線程睡眠5到6秒之間的隨機時間段),然後繼續。線程沒有按照預期的順序完成。

現在的問題。我可以得到一個線程完成所需的總時間;我想要的是將線程中的所有時間存儲到一個數組中,並能夠計算最快的時間。

要做到這一點,我應該把數組放在main.class文件中?我是否會正確地承認,因爲如果它被放置在Thread類中,它將無法工作。或者我應該創建第三堂課嗎?

我小有一點困惑:/

回答

4

它的優良聲明它在你調用線程的方法,有幾點注意事項:

  • 每個線程都應該知道其在數組中的索引。也許你應該通過這個在構造
  • 那麼你有三種選擇填充陣列
    • 陣列應該是final,以便它可以匿名類
    • 數組可以傳遞給每個線程
    • 內使用
    • 線程應該在完成時通知監聽器,這反過來會增加一個數組。
  • 考慮使用Java 1.5 Executors framework來提交Runnables,而不是直接使用線程。
+0

我會建議使用'ConcurrentHashMap'代替陣列 – yegor256 2012-02-23 23:03:49

+0

是,也能發揮作用,而不是線程應該知道自己的指數。 – Bozho 2012-02-23 23:05:12

+0

感謝所有的答覆 - 我正在努力實現它現在。 BTW考慮共享變量是否涉及我可以使用關鍵字易失性?或者這是矯枉過正,因爲線程將寫入數組中的不同位置? – Katana24 2012-02-25 13:47:02

2

編輯:下面的解決方案假設你只需要所有的競爭對手已經完成比賽。

您可以使用如下所示的結構(在您的主類中)。通常你想添加很多你自己的東西;這是主要提綱。

請注意,併發並不是一個問題,因爲在線程運行完畢後,您會從MyRunnable實例中獲取值。

請注意,對於每個競爭對手使用單獨的線程可能不是真正需要修改的方法,但這將是一個不同的問題。

public static void main(String[] args) { 
    MyRunnable[] runnables = new MyRunnable[NUM_THREADS]; 
    Thread[] threads = new Thread[NUM_THREADS]; 

    for (int i = 0; i < NUM_THREADS; i++) { 
     runnables[i] = new MyRunnable(); 
     threads[i] = new Thread(runnables[i]); 
    } 

    // start threads 
    for (Thread thread : threads) { 
     thread.start(); 
    } 

    // wait for threads 
    for (Thread thread : threads) { 
     try { 
      thread.join(); 
     } catch (InterruptedException e) { 
      // ignored 
     } 
    } 

    // get the times you calculated for each thread 
    for (int i = 0; i < NUM_THREADS; i++) { 
     int timeSpent = runnables[i].getTimeSpent(); 
     // do something with the time spent 
    } 
} 

static class MyRunnable implements Runnable { 
    private int timeSpent;   

    public MyRunnable(...) { 
     // initialize 
    } 

    public void run() { 
     // whatever the thread should do 

     // finally set the time 
     timeSpent = ...; 
    } 

    public int getTimeSpent() { 
     return timeSpent; 
    } 
}