2016-06-01 7 views
0

私は本で例を挙げており、トラフィックライトがシミュレートされたスレッド化された例があります。私はこのプログラムのほとんどを理解していますが、「別のスレッドがそれぞれのトラフィックライトを実行する」という部分については混乱していますが、メインアプリケーションには1つのスレッドしか作成されていないようです。 私は、私の交通信号のすべての定数を列挙しています。Threaded TrafficLight多数のスレッドを例にしていますか?

public enum TrafficLightColor { 
YELLOW,GREEN,RED 
} 

これは残りのプログラムです。

public class TrafficLightSimulator implements Runnable { 
private Thread thread;//holds the thread that runs the simulation 
private TrafficLightColor color;//holds the traffic light color 
boolean stop=false;//set to true to stop the simulation 
boolean changed=false;//true when the light has changed 
public TrafficLightSimulator(TrafficLightColor inital){ 
color=inital; 
thread=new Thread(this); 
thread.start(); 
} 
public TrafficLightSimulator(){ 
color=TrafficLightColor.RED; 
thread=new Thread(this); 
thread.start(); 
} 
@Override 
public void run() { 
    //start up the light 
    while(!stop){ 
     try{ 
      switch(color){ 
      case GREEN: 
       Thread.sleep(10000);//green sleeps for 10 seconds 
       break; 
      case RED: 
       Thread.sleep(2000);//yellow for 2 seconds 
       break; 
      case YELLOW: 
       Thread.sleep(12000);//red for 12 seconds 
       break; 

      } 
     }catch(Exception e){ 

     } 
     changeColor(); 
    } 
} 
synchronized void changeColor(){ 
    switch(color){ 
    case RED: 
     color=TrafficLightColor.GREEN; 
     break; 
    case YELLOW:  
     color=TrafficLightColor.RED; 
     break; 
    case GREEN: 
     color=TrafficLightColor.YELLOW;  
    } 
    changed=true; 
    System.out.println("Notfiy Called We changed the light"); 
    notify(); 
} 
synchronized void waitForChange(){ 
    try{ 
     while(!changed){ 
      System.out.println("waiting for Light to change"); 
      wait(); 
     } 
     changed=false; 

    }catch(Exception e){ 

    } 
} 
synchronized TrafficLightColor getColor(){ 
    return color; 
} 
synchronized void cancel(){ 
    stop=true; 
} 

} 
class Demo{ 
public static void main(String[]args){ 
    TrafficLightSimulator t1=new  TrafficLightSimulator(TrafficLightColor.YELLOW); 
    for(int i=0;i<9;i++){ 
     System.out.println(t1.getColor()); 
     t1.waitForChange(); 
    } 
    t1.cancel(); 
} 
} 
+0

は二つのスレッド、プログラムのメインスレッドと交通シミュレータのスレッドがありますが、多分本は誤植を持っており、彼らは意味* – Gusman

+0

なぜmehtodsを行います同期する必要があるTrafficLightSimulator上でスレッドが1つしか動作しない場合はhronizedですか? – Eli

+0

他のスレッドがTrafficLightSimulatorスレッドと通信しているメインスレッドだと思いますか? – Eli

答えて

0

印刷各printlnコマンド内のスレッドの名前が、それはあなたが、コードのどの部分を実行しているスレッドを示し、そしてそれはあなたが何が起こっているか理解するのに役立ちます。
ジャスト:

System.out.println(Thread.currentThread().getName() + "==>" 
        + "Notfiy Called We changed the light"); 

アプリケーションを実行する場合は、あなたが得る:

Thread-0==> start up the light 
main==>YELLOW 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>RED 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>GREEN 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>YELLOW 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>RED 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>GREEN 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>YELLOW 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>RED 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
main==>GREEN 
main==>waiting for Light to change 
Thread-0==>Notfiy Called We changed the light 
Thread-0==>Notfiy Called We changed the light 

を各Javaアプリケーションでメインスレッドが常にある - このスレッドは、Java仮想マシンによって作成されましたメインスレッドはアプリケーションコード(public static void main()メソッドを呼び出す)を実行します。
アプリケーションが他のスレッドを作成して開始することができます - あなたのコードでそれが名前だThread-0あり、それを作成し、コンストラクタで開始された - ここに:

public TrafficLightSimulator(TrafficLightColor inital) { 
    color = inital; 
    thread = new Thread(this); // creates a new thread 
    thread.start();    // starts the new thread 
} 

、コピーペーストして、このコードを実行してください、それはThread.currentThread().getName() + "==>"を含めました各printlnコマンドで:別々のスレッドは、各交通シミュレータを実行します*

public class TrafficLightSimulator implements Runnable { 

    private Thread thread;// holds the thread that runs the simulation 
    private TrafficLightColor color;// holds the traffic light color 
    boolean stop = false;// set to true to stop the simulation 
    boolean changed = false;// true when the light has changed 

    public TrafficLightSimulator(TrafficLightColor inital) { 
     color = inital; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    public TrafficLightSimulator() { 
     color = TrafficLightColor.RED; 
     thread = new Thread(this); 
     thread.start(); 
    } 

    @Override 
    public void run() { 
     // start up the light 
     System.out.println(Thread.currentThread().getName() +"==>" +" start up the light"); 
     while (!stop) { 
      try { 
       switch (color) { 
       case GREEN: 
        Thread.sleep(10000);// green sleeps for 10 seconds 
        break; 
       case RED: 
        Thread.sleep(2000);// yellow for 2 seconds 
        break; 
       case YELLOW: 
        Thread.sleep(12000);// red for 12 seconds 
        break; 

       } 
      } catch (Exception e) { 

      } 
      changeColor(); 
     } 
    } 

    synchronized void changeColor() { 
     switch (color) { 
     case RED: 
      color = TrafficLightColor.GREEN; 
      break; 
     case YELLOW: 
      color = TrafficLightColor.RED; 
      break; 
     case GREEN: 
      color = TrafficLightColor.YELLOW; 
     } 
     changed = true; 
     System.out.println(Thread.currentThread().getName() + "==>" + "Notfiy Called We changed the light"); 
     notify(); 
    } 

    synchronized void waitForChange() { 
     try { 
      while (!changed) { 
       System.out.println(Thread.currentThread().getName() + "==>" + "waiting for Light to change"); 
       wait(); 
      } 
      changed = false; 

     } catch (Exception e) { 

     } 
    } 

    synchronized TrafficLightColor getColor() { 
     return color; 
    } 

    synchronized void cancel() { 
     stop = true; 
    } 

    public static void main(String[] args) { 
     TrafficLightSimulator t1 = new TrafficLightSimulator(TrafficLightColor.YELLOW); 
     for (int i = 0; i < 9; i++) { 
      System.out.println(Thread.currentThread().getName() + "==>" + t1.getColor()); 
      t1.waitForChange(); 
     } 
     t1.cancel(); 
    } 

} 
関連する問題