Wpis z mikrobloga

Mirki,
zacząłem uczyć się podstaw programowania wielowątkowego w Javie, mam zagwozdkę.
Chcę napisać program, który:
- zaczytuje przez port szeregowy dane z czujnika co jakiś okres (10s w tym przypadku) i zapisuje je do pliku.
- monitoruje na bieżąco stan tego pliku i ewentualne nowe pozycje wprowadza do listy, którą potem będę obrabiał - min. wykresy o zmiennym zakresie czasowym itd.
Tyle o ile pierwszy punkt zrealizowałem bez problemów, to sprzęgnięcie go z drugą funkcjonalnością mnie chyba dzisiaj przerosło. Da się to zrealizować poprzez zwykłe wait i notify? Stworzyłem dodatkowy obiekt (temperatureSensor), który ma zmienną świadczącą o zajętości pliku. Korzystają z niego oba wątki, przed przystąpieniem do działania sprawdzają jej stan w pętli, a gdy przystępują do działania, zmieniają jej status. Pomijając fakt, że 2 wątek zazwyczaj nie działa jak powinien, dodatkowo wywala błąd IllegalMonitorStateException. Jakaś dobra dusza naprowadzi? Wychodzi na to, że źle używam tych metod :<
http://pokazkod.pl/49432d441999d2bcfd2e1e037db9cbfcb2349959824cfd6e5b
#java #programowanie
  • 5
@wafel93: dobra, ale po co w ogole plik?
Jesli musi byc plik, to nie wstarczy, ze metody zapisu i odczytu pliku beda synchronizowane na tym samym obiekcie i po sprawie?
A poza tym do monitorwania plikow to sa jakies magiczne API :P
@M4ks: plik jest potrzebny do zachowywania odczytów - w założeniu jest załadowywany, gdy będę uruchamiał program. W sumie mógłbym stworzyć po prostu klasę i zsynchronizowane metody save(), load(). Chyba przekombinowałem sprawę, może spróbuję w takim układzie jak proponujesz :)
@wafel93:

1. IllegalMonitorStateException bo zeby zrobic wait() najpierw musisz miec monitor. Rob wait na obiekcie na ktorym masz monitor, czyli na NotifyObject.

2. najpierw synchronizeed, potem while, potem wait:
synchronized(notifyObject){while(islocked){notifyObject.wait();}}