2016-04-19 19 views
1

2つのスレッドを持つことによってJavaでマルチスレッドを使用しようとしています。スレッドの1つは、交差点を通って一方向に進む車を表し、もう一方は交差点を通過する別の車を表します。私の問題は、car2が「car2はそれを6回だけ印刷すべきである」よりも多くの時間、「交差するのを待っている」ということです。私は同期を使用しようとしましたが、それは動作しません。これは非常に簡単なプログラムで、マルチスレッドを理解するのに役立つようにしようとしています。同じ量をプリントアウトする必要があり、それは "車2が交差する待っている" と言うjava multithreading:交通交差システム

以下になっ
public class Drive { 
    public static Thread car1; 
    public static Thread car2; 

    public static void main(String[]args){ 

     Cars cars = new Cars(); 

     car1 = new Thread(cars, "car 1"); 
     car2 = new Thread(cars, "car 2"); 

     car1.start(); 
     car2.start(); 

    } 
} 

public class Cars implements Runnable{ 

    int distance = 0; 

    public void increaseDistance(){ 
     distance ++; 
    } 

    public void race(){ 
     while(distance <= 5){ 

      if(Thread.currentThread().getName().equals("car 1")){    
       System.out.println("Distance covered by " + Thread.currentThread().getName() + " is " + distance + " meters"); 
       increaseDistance(); 
      } 

      if(Thread.currentThread().getName().equals("car 2")){ 

       System.out.println(Thread.currentThread().getName() + " is waiting to cross"); 
      } 

     } 

    } 

    public void run(){ 
     race(); 
    } 
} 

出力イム...

car 2 is waiting to cross 
car 2 is waiting to cross 
car 2 is waiting to cross 
car 2 is waiting to cross 
car 2 is waiting to cross 
Distance covered by car 1 is 0 meters 
car 2 is waiting to cross 
Distance covered by car 1 is 1 meters 
Distance covered by car 1 is 2 meters 
Distance covered by car 1 is 3 meters 
Distance covered by car 1 is 4 meters 
Distance covered by car 1 is 5 meters 
car 2 is waiting to cross 

「車1でカバーされる距離はxメートルですが、毎回ランダムです。

+0

*同じ回数印刷する必要があります。なぜですか?プログラムを複数回実行して、結果を比較してみてください。 –

+0

car2は、car1が交差するまで待っているだけなので、 – Phill

+0

と言ってください。はい。それは毎回ランダムです。マルチスレッド開発の世界へようこそ。 –

答えて

1

car2のrace()メソッドは、car1のincrementDistance()メソッドが呼び出された後に1回だけ実行する必要はありません。このメソッドを複数回呼び出すことは可能です。不規則なスケジューリングの世界へようこそ。

car2がincrementDistance()を呼び出したことをcar2に通知する条件を使用し、car2はrace()メソッドでこの条件を待機する必要があります。 これは、car2が期待される出力を確実に印刷するようにします。

0

スレッドを「車1」だけ増やし、ループが停止するタイミングを決定します。スレッドは独立して速度が変化するため、「カー2」の印刷回数は予測できません。