Synchronizacja i koordynacja wątków - pomoc w zadaniu

0

Kod, działający w wątku A czyta z pliku C:\Temp\Towary.txt informacje o towarach w postaci:

id_towaru waga

tworzy obiekty klasy Towar, zawierające przeczytane informacje oraz wyprowadza na konsolę informacje o liczbie utworzonych obiektów. Informacja ma być wyprowadzana co 200 obiektów w postaci:

utworzono 200 obiektów
utworzono 400 obiektów
utworzono 600 obiektów
itd.

Kod działający równolegle w innym wątku (B) sięga po te obiekty, sumuje wagę towarów i wyprowadza na konsolę informację o przeprowadzonym sumowaniu co 100 obiektów np.:
policzono wagę 100 towarów
policzono wagę 200 towarów
policzono wagę 300 towarów
itd.
Na końcu podaje sumaryczną wagę wszystkich towarów.

Uwaga1: plik powinien zawierać co najmniej 10 tys. opisów towarów (należy sobie go wygenerować programistycznie, ale na boku, nie w tym programie), nazwa pliku (wraz ze ścieżką) jest obowiązkowa i podajemy ją bezpośrednio w tekście programu..

Uwaga2: zapewnić synchronizację i koordynację pracy obu wątków.


Do tej pory udało mi się zrobić program, który generuje opisy towarów, także mam już plik Towary.txt, który ma ponad 10tys opisów towarów.
W pliku towary wyglądają tak:

id_towaru waga
877458 413
753319 391
335399 995
762858 510
680801 11
445393 266
120380 839
480931 991
...

Odczytywanie z pliku zrobiłabym tak:

FileReader fileR = new FileReader("C:\Temp\Towary.txt");
 BufferedReader bufferedReader = new BufferedReader(fileR);
 

I niestety dalej nie wiem co mam zrobić.
Chyba nie do końca rozumiem jak ma działać ten program, dlatego nie wiem za co zabrać się teraz w pisaniu kodu.
Prosiłabym o wyjaśnienie, w miarę proste (i może oczywiste dla niektórych) oraz jakieś wskazówki.
Szukałam na forum podobnego tematu, ale jak już ktoś o to zadanie pytał, to albo nie uzyskał odpowiedzi, ale wskazówka, którą dostał mi nie pomogła :(
Z góry dziękuję za pomoc.

0

To jest problem Producent-Konsument. Przykładowe rozwiązania: http://www.java2s.com/Code/Java/Threads/Producer-Consumer.htm
Jedyne co musisz zrobić to zmienić przekazywane dane w tych przykładach na dane odczytane z pliku.

0

W prawdzie zadanie wypisuje ilość obiektów i towarów w dwóch wątkach.
Ale nie pokazuje zsumowanej wagi towarów.
Co więcej na konsoli brak "press any key to continue", więc mam rozumieć, że program się nie kończy? Jakby policzył te np 12000 plików i jak się skończyły to utknął?

0

Wrzuć chociaż kod bo tak to jest jak czytanie z fusów. :) Btw. Znam to zadanie... ;)

Możesz użyć PipedReader i PipedWriter klasy te służą do komunikacji miedzy wątkami.
W jednej klasie (ta, która produkuje towary) robisz cos takiego:

 
PipedWriter out = new PipedWriter();
public void run() {
//Powiedzmy, ze jakoś tak tworzysz towary:
while(in.hasLine) {
Towar tow = new towar (nazwa, waga);
out.write(waga); 
}
out.write(-1);
}

Teraz w klasie, która będzie czytała te dane musisz przekazać obiekt PipedWriter i robisz cos takiego:

 
PipedReader in = new PipedReader(out) // out to przekazany obiekt PipedWriter
int temp, sum;
public void run() {
while((temp = (int) in.read() ) != -1) {
sum += temp;
}
System.out.println("Laczna waga to " + sum);
}
}

Oczywisciew tych petlach dodajesz int, ktory bedzie zliczal ile jest tych towarow i ile zsumowal wag.

W sumie masz 3 klasy
Tworzaca towary, sumujaca wage i jakas Main, ktora to wszystko organizuje. ;]
Cos takiego... ;P Kod na szybko pisany wiec moga byc jakies male bledy. ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1