2012-02-23 12 views
0

私はJavaのスレッドに少し問題があります。基本的には、スレッドの配列を作成し、それらを開始する。プログラムのポイントは、レースをシミュレートし、各競技者(すなわち各スレッド)の時間を合計し、勝者を選ぶことである。スレッドに関するいくつかの問題

競技者は1つのスペースを移動し、待機します(つまり、スレッドは5〜6秒の間にランダムにスリープします)。スレッドは、期待どおりに開始した順序で完了しません。

問題が発生しました。スレッドが完了するまでに要する合計時間を取得できます。私が望むのは、スレッドからのすべての時間を単一の配列に格納し、最も速い時間を計算できるようにすることです。

これを行うには、配列をmain.classファイルに配置する必要がありますか?私はそれがThreadクラスに置かれていればうまくいきません。それとも、私は第三のクラスを作るべきですか?

私はalittleが混乱している:それはいくつかのノートで、あなたがスレッドを起動する方法でそれを宣言するために細かいです/

答えて

4

  • 各スレッドが配列でインデックスを知っている必要があります。おそらく、あなたはコンストラクタ
  • でこれを渡す必要があり、あなたは配列の各スレッドに渡すことができます匿名クラス
  • 内で使用することができるように、アレイは、finalあるべき配列に
    • を充填するための3つのオプションがあり
    • スレッドは完了時にリスナーに通知し、配列をインクリメントします。
  • Java 1.5 Executors frameworkを使用して、スレッドで直接作業するのではなく、ランタイムを送信することを検討してください。
+0

私は 'ConcurrentHashMap'の代わりに、配列 – yegor256

+0

はい、同様に動作し、スレッドがそのインデックスを認識するべきではありませんを使用することをお勧めします。 – Bozho

+0

返信いただきありがとうございます。私は今すぐ実装しています。私はキーワードvolatileを使用することができます共有変数を考慮してBTW?スレッドが配列内の別の位置に書き込むので、これは過剰ですか? – Katana24

2

EDIT:以下のソリューションは、あなただけ後のすべての競合他社がレースを終えた時間を必要とする前提としています。

以下のような構造(メインクラス内)を使用できます。通常は、自分のものをたくさん追加したいと思っています。これが主要な概要です。

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; 
    } 
} 
関連する問題