У меня есть два класса Первый и Второй. В классе Сначала я просто запускаю два потока. Класс 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] в обоих потоках. Как решить эту проблему? Должен ли я использовать переменную блокировки?
Измените 'read()' на синхронизированный метод. Это устранит вашу проблему. – gparyani
Пожалуйста, не пытайтесь пересчитать ошибки, которые вы получаете; скопируйте и вставьте трассировку стека. – chrylis
@chrylis - правый. Мне пришлось прорыть код, чтобы узнать, где ваш вызов 'wait()' is. – gparyani