Mam generalnie taki problem.
Jeden watek jest odpowiedzialny z wczytywanie z pliku po kolei liczb i powiadomienie działających wątków, że liczba się zmieniła. Wtedy każdy z wątków powinien się wybudzić, sprawdzić czy pobrana liczba jest równa nazwie tego wątku (1,2,3,4,5....), jeśli tak to wypisuje swoja nazwe na ekran. Jeśli nie to zasypia bez wypisywania i czeka dalej. A wiec:
Watek odpowiedzialny za pobranie liczby z pliku:
public class Losuj extends Thread{
public void run(){
try{
File f = new File("test.txt"); //otwieramy plik
Scanner scaner = new Scanner(f);
while(scaner.hasNext()){ //dopoki w pliku sa liczby
synchronized(n){ //wszystkie watki spia
n = scaner.nextInt(); //pobieramy liczbe
System.out.println("Losuje nowa liczbe " + n);
n.notifyAll(); // daje znac spiacym watka ze liczba wylosowana
} // i wychodze z bloku dajac szanse pozostalym watka aby
} // podzialaly na zmiennej n !!! wlasnie tu sie program
// wysypuje
catch (FileNotFoundException ex){
}
}
}
Watek wypisujacy swoja nazwe:
public class Watek3 extends Thread{
private Integer _name;
public Watek3(int name){
_name = new Integer(name);
};
public void run(){
while(true){
try{
synchronized(n){
if (_name.equals(n)){
System.out.println("!!!!!!!!!!!!!!!!!!Jestem watkiem nr " + _name +" "+ n);
}
System.out.println("Spie " + _name);
n.wait();
}
}
catch (InterruptedException ex){
}
}
}
}
n to zmienna globalna
W watku Losuj przy notifyAll() leci wyjatek IllegalMonitorStateException. Nie łapie dlaczego? Przecież wszystkie wątki wypisujace spią tzn że monitor jest wolny, więc program bez problemu wchodzi do bloku synchronized w watku Losuj i niby czemu nie jest wtedy wlascicielem monitora?
Bylabym wdzieczna jeśli byłby ktoś w stanie pomóc