2012-12-23 112 views
2

我想在java中使用多線程概念實現交通信號。我想使用同步。這是我寫的代碼,但它不會按照我的期望運行:P ..我實際上做的是採用一個變量「a」,它的值決定了在特定時間應該打開哪個燈。例如:a == 0應該給紅燈,然後紅燈獲得「a」的鎖定,並在某個間隔後將值更改爲== 1,然後打開到橙燈,綠燈也是如此以及..java多線程交通信號示例

代碼:

package test; 

class Lights implements Runnable { 

    int a=0,i,j=25; 
    synchronized public void valueA() 
    { 
     a=a+1; 
    } 

    public void showLight() 
    { 
     System.out.println("The Light is "+ Thread.currentThread().getName()); 
    } 
    @Override 
    public void run() { 
     // TODO Auto-generated method stub 
      for(i=25;i>=0;i--) 
      { 
       while(j<=i&&j>=10&&a==0) 
       { 
       showLight(); 
      /*some code here that locks the value of "a" for thread 1 
       and keeps it until thread 1 unlocks it! */ 
       try { 

        Thread.sleep(1000); 


       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       j--; 
       } 


      while(j<10&&j>=5&&a==1) 
      { 

       showLight(); 
       /*some code here that locks the value of "a" for thread 1 
       and keeps it until thread 1 unlocks it! */ 
       try { 
        Thread.sleep(500); 

       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       j--; 
      } 


      while(j<5&&j>=0&&a==2) 
      { 
       showLight(); 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } 
      } 
    } 
} 

主類:當你有類的幾個不同的實例

package test; 

public class MainTraffic { 
public static void main(String args[]) 
{ 
    Runnable lights=new Lights(); 

    Thread one=new Thread(lights); 
    Thread two=new Thread(lights); 
    Thread three=new Thread(lights); 

    one.setName("red"); 
    two.setName("orange"); 
    three.setName("green"); 

    one.start(); 
    two.start(); 
    three.start(); 


} 
} 
+1

一個問題(與多線程無關)是Lights的每個實例都使用實例'a'字段 - 換句話說,您的三個燈中的每一個都有自己的'a',因此它們彼此獨立工作。 – assylias

+0

我如何讓他們訪問相同的值! – Chandeep

+0

最簡單的方法是將變量'a'設爲靜態 - 但這可能不是最好的解決方案。 – assylias

回答

1

同步(這)是不是非常有用。只有在同一個對象上同步的塊不能並行運行。

一種選擇是將一個通用對象(可能包含您希望它們使用的「a」)傳遞給Lights構造函數,並使線程在該對象上同步。

+0

我試圖使用這樣的: \t同步公共無效值a() \t { \t \t A = A + 1; \t} 然後調用valueA()在方法執行完成後增加a的值!但是我想要的是一個線程會使紅色顯示屏持續25秒,然後在10秒內持續10秒,而綠色則持續5秒!而我沒有得到它! – Chandeep

+0

我編輯了一下代碼..!根據你說什麼,但我仍然有問題..我已經評論了問題的路線! – Chandeep

+0

@ user975234我已經看過發佈的代碼,並沒有代表我推薦的更改。如果您需要編輯代碼的幫助,請發佈。 –