2012-02-14 113 views
1

我希望有人會幫助我。我一直在嘗試用java線程製作交通燈。 有兩個圓圈。每個圓圈都是燈(線)。我想每個燈設置爲x毫秒的工作,然後關閉並讓其他燈的工作(幾秒鐘一次又一次..)java線程簡單的愚蠢程序

public void run() 
{ 
    while (true) 
    {   
     repaint(); 
     if (working) 
     { 
      System.out.println(name + " is WORKING "); 
      try 
      { 
       Thread.sleep(LAMP_WORKING_TIME); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 

      System.out.println(name + " has done working"); 

      synchronized (lock) 
      { 
       this.working = false; 
       lock.notifyAll(); 
      } 
     } 
     else 
     { 
      try 
      { 
       System.out.println(name + " is waiting.."); 

       synchronized (lock) 
       { 
        lock.wait(); 
        working = true; 
       } 

       System.out.println(name + " is WAKING UP AFTER WAIT"); 
      } 
      catch (InterruptedException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

當鎖被聲明爲類的屬性:

private final Object lock = new Object(); 

我相信我的問題發生在等待/通知方法。 請幫我解決這個問題!

+0

這不是我的家庭作業。沒有人會檢查它。這是一個準備測試。 – Noray 2012-02-14 17:24:11

+0

你應該包含更多的代碼。你在哪裏以及如何定義「工作」和「鎖定」? – toto2 2012-02-14 17:53:31

+0

另外,我不知道你是否在學習wait/notify,但是如果沒有,你應該知道它們已經被棄用了,你應該使用java.util.concurrent中的工具。但在你的情況下,它看起來像一個擺動計時器不正是你想要的。 – toto2 2012-02-14 17:55:00

回答

1

您可能想讓您的lock在實例之間共享。因此,要麼將其作爲參數static,要麼將其作爲參數傳遞給Runnables/Threads,而不是爲每個實例創建一個新參數,即使它是final

+0

謝謝。這是工作! :) – Noray 2012-02-14 17:40:45

2

當您的代碼讀取時,它將等待LAMP_WORKING_TIME ms,將其設置爲false,並在下一個循環中立即將其設置爲true。你只有在working爲真時纔會睡覺,所以你的「開啓」週期是LAMP_WORKING_TIME,「關閉」週期只要釋放和重新獲取鎖定。可能不到1ms。

+0

使用eclipse調試程序我不會到達working = true的行(在鎖定塊中等待後) – Noray 2012-02-14 17:38:06