2012-02-14 2 views
1

Надеюсь, кто-то мне поможет. Я пытаюсь сделать светофор с java Threads. Есть два круга. Каждый круг представляет собой лампу (нить). Я хотел бы, чтобы каждый светильник работать х мс, а затем выключить и пусть другие лампы работы (опять же на несколько секунд и снова ..)java threads простая глупая программа

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(); 

Я считаю, что моя проблема возникает с помощью методов wait/notify. Пожалуйста, помогите мне исправить это!

+0

Это не моя домашняя работа. Никто не собирается проверять это. Это подготовка к тесту. – Noray

+0

Вы должны добавить больше кода. Где и как вы определяете 'work' и' lock'? – toto2

+0

Кроме того, я не знаю, если вы делаете это, чтобы узнать wait/notify, но если нет, вы должны знать, что они несколько устарели, и вместо этого вы должны использовать утилиты в java.util.concurrent. Но в вашем случае это похоже, что Swing Timer делает именно то, что вы хотите. – toto2

ответ

1

Возможно, вы захотите сделать свой lock обмен между экземплярами. Поэтому либо сделайте это static, либо передайте его в Runnables/Threads в качестве параметра вместо создания нового для каждого экземпляра, даже если это final.

+0

Спасибо. Это работает! :) – Noray

2

Как будет выглядеть ваш код, он будет ждать LAMP_WORKING_TIME мс, задает значение false и следующий цикл сразу вернет его в true. Вы спите только тогда, когда это working истинно, поэтому ваш цикл «on» равен LAMP_WORKING_TIME, а цикл «off» - столько, сколько требуется, чтобы выпустить и снова запереть замок. Вероятно, менее 1 мс.

+0

С отладчиком eclipse я не добираюсь до строки, где работает = true (после ожидания в блоке блокировки) – Noray

Смежные вопросы