2013-08-24 2 views
0

У меня есть два класса Первый и Второй. В классе Сначала я просто запускаю два потока. Класс Second имеет два метода: один для изменения статического массива переменных и один для чтения массива после изменения. Я хочу сделать это, подождите и сообщите.wait() и notify() методы

class First{ 
    public static void main(String[] args){ 
    Second s1 = new Second(1); 
    Second s2 = new Second(2); 
    s1.start(); 
    s2.start(); 
    } 
} 

    class Second extends Thread{ 
     private static int[] array = {1, 2, 3}; 
     private int number; 

     Second(int number){ 
     this.number = number; 
     } 

     public void run(){ 
     change(); 
     System.out.println("Out of change: " + getName()); 
     read(); 
     } 

     public synchronized void change(){ 
     if(array[0] != 1) 
      return; 

     System.out.println("Change: " + getName()); 
     for(int i = 0; i < 10; i++) 
      array[0] += i; 
     notify(); 
     } 

     public synchronized void read(){ 
      try{ 
      System.out.println("Waiting for change:" + getName()); 
      wait(); 
      } 
      catch(InterruptedException ie){ 
      ie.printStackTrace(); 
      } 
     System.out.println("Score: " + array[0]); 
     } 

} 

Я получаю исключение IllegalMonitorException. Я хочу один массив изменений потока [0] до 46, а затем читать массив [0] в обоих потоках. Как решить эту проблему? Должен ли я использовать переменную блокировки?

+2

Измените 'read()' на синхронизированный метод. Это устранит вашу проблему. – gparyani

+1

Пожалуйста, не пытайтесь пересчитать ошибки, которые вы получаете; скопируйте и вставьте трассировку стека. – chrylis

+0

@chrylis - правый. Мне пришлось прорыть код, чтобы узнать, где ваш вызов 'wait()' is. – gparyani

ответ

2

Для использования wait, вы должны называть его синхронным методом. Вы вызываете его из несинхронизированного метода. Выполнение задачи read будет решено.

Кстати, было бы лучше заблокировать массив вместо потока, потому что это то, где требуется управление данными. Вы можете сделать это, делая ваши методы синхронизированы, затем положить весь код внутри этого:

synchronized(array) { 
    // put all the code here 
} 

Затем измените вызовы на wait и notify в array.wait и array.notify.

+0

нормально, я изменить это, и это выход: Изменения: Thread-3 Из изменений: Thread-3 Ожидания изменения: Thread-3 Изменение: Thread-4 Из изменений: Thread-4 Ожидания изменить: Thread-4 Где результат? – szeljic

+0

@StrahinjaZeljic Пожалуйста, не комментируйте свой результат. Вместо этого отредактируйте свой пост, объясните, что вы пробовали, и поместите там вывод. – gparyani

+0

Ваше 'уведомление 'потеряно, потому что оно происходит до' wait'. Если вы скажете мне, что именно вы пытаетесь достичь, я могу написать ваш код для вас, или вы можете исследовать потоки немного больше. – tbodt

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