Witam
Staram się opanować wielowątkowość. I mam problem z koordynacją.
Chciałbym aby czytacz i obliczacz współpracowały ze sobą , czytacz niech odczytuje po 200 towarów(i tworzy z nich obiekty) z pliku. Natomiast obliczacz niech równolegle coś tam liczy z odczytanych (w tym przykładzie danych o towarach ) po 100.
Czyli czytacz tworzy 200 obiektów, obliczacz niech liczy po 100, gdy obiekty się kończą niech czytacz doczytuje.
I nie rozumiem chyba za bardzo działania synchronizacji, (Prośba o prze-edukowanie) .
Bo wait() mogę tylko zgłosić z sekcji krytycznej , więc rygluje klasę Towar w bloku synchronizowanym w metodzie run żeby drugi wątek nie miał dostępu do statycznej kolekcji obiektów towarów.
Efekt powinien być taki według mnie że póki nie zwolnię rygla metody statyczne z klasy Towar są blokowane.
Więc gdy zrobię taką samą synchronizacje w bloku instrukcji w obliczaczu będzie ok.
Ale jednak coś jest nie tak, bo gdy wrzucam wait z czytacza otrzymuje "illegal monitor state exception"
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
public class Czytacz extends Thread {
boolean read200 = false;
String txt = null;
int licznik = 0;
public void run(){
try {
FileReader fr = new FileReader("towar.txt");
LineNumberReader lr = new LineNumberReader(fr);
synchronized(Towar.class){
while(!read200){
Towar t = new Towar();
txt = lr.readLine();
t.id = Integer.parseInt( txt.substring(0, txt.indexOf(' ')) );
t.waga = Double.parseDouble( txt.substring( txt.indexOf(' ') ) );
Towar.add(t);
licznik++;
if( (licznik%200) == 0){
read200 = true;
wait();
}
}
}
} catch (IOException | InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
read200 = true;
}
}
}
Nie rozumiem tego ,dlatego proszę niech ktoś mi nie wrzuca kodu który działa ...tylko mi wytłumaczy (najlepiej na przykładzie) jak obchodzić się z koordynacją wątków.
Z góry dziękuje za pomoc i zainteresowanie.