Beadandó feladat

A beadandó feladat egy mozinak és látogatóinak szimulációja.

Mozi

A Mozi osztály tárolja el a nevét, a portját, kétfajta belépődíjat (díj1 és díj2), a férőhelyek számát és a nyitvatartási időt (ezredmásodpercben). Továbbá a mozi tartsa számon az összbevételét, az eddigi látogatók számát, és az aktuális előadás nézőinek számát. A Mozi legyen szálként elindítható: ekkor indítson a portján egy szervert, és várja a bejövő kapcsolatokat. Minden egyes kapcsolatra legfeljebb egy másodpercig várakozzon a mozi (lásd Socket.setSoTimeout), ha ez lejárt, de még nincs itt az idő vége, várakozzon újra.

A kezdéstől számítva a nyitvatartási idő leteltével a mozi, amilyen gyorsan csak lehet, fejezze be tevékenységét: ne várjon több látogatót (legfeljebb még egy utolsót a setSoTimeout erejéig), és ha vannak filmre várakozó látogatók, akkor mindegyiknek küldje el a "bezart" üzenetet, majd fejezze be futását.

A mozi kezeljen minden egyes bejövő kapcsolatot külön szálon. A kapcsolódó kliensek a mozival szövegesen, soronként kommunikálnak, és az alábbi üzeneteket küldhetik.

Látogató

A Latogato osztály példányainak van neve, pénze, és adott, hogy melyik fajta jegyeket preferálja. Legyen szálként elindítható; működése során véletlenszerűen válasszon ki egy mozit, és próbálja meg felvenni vele a kapcsolatot. Ha ez nem sikerül (már bezárt a mozi), akkor felejtse el a mozit (többet ne próbálkozzon vele); ha már nincsen olyan mozi, amellyel próbálkozhatna, akkor fejezze be a futását.

A kiválasztott mozitól kérje le először az általa preferált jegytípus árát. Ha ez megfizethető számára, akkor váltson ilyen jegyet, ha nem, akkor próbálkozzon a másik jegytípussal; ha arra sincsen elég pénze, akkor ismét válasszon véletlenszerűen egy mozit. Ha beült a moziba, várja meg a mozi válaszát, ami kétféle lehet: vagy egy szám (amelynek meg kell egyeznie a váltott jegy árával), ezt vonja le a látogató a saját pénzéből, vagy pedig a bezart üzenet, mely esetben felejtse el a mozit. Mindkét esetben folytassa a látogató a mozik véletlen látogatását, kivéve, ha teljesen elfogyott a pénze.

Főprogram

A moziadatok.txt fájlban szövegesen meg vannak adva Mozi és Latogato példányok adatai egy-egy sorban, illetve várakozások. A MoziMain osztályban található főprogram dolgozza fel a fájlt: ha mozihoz vagy látogatóhoz ér, készítsen egy-egy megfelelő példányt, és indítsa el azt. Latogato példány készítésekor adjuk át neki az eddig elkészített mozik portjait is; új Mozi esetén minden eddigi Latogato kapja meg az új mozi portját (ehhez egy ujMozi műveletet érdemes felvenni). A var utasítás hatására a főprogram várakozzon a megadott időtartamig (ezredmásodpercben).

A moziadatok.txt egy lehetséges tartalma a következő. Az adatok a megfelelő osztályoknál leírt sorrendben szerepelnek.

mozi Mozi1 12345 200 100 3 30000 
mozi Mozi2 12346 456 123 2 40000 
mozi Mozi3 12347 999 30 2 50000 
latogato Lat1 1500 true
latogato Lat2 2000 false
latogato Lat3 2500 true
latogato Lat4 3000 false
latogato Lat5 4000 true
var 20000
mozi Mozi4 12348 500 100 4 20000 
latogato Lat6 5000 false
latogato Lat7 6000 true
latogato Lat8 7000 false
latogato Lat9 8000 true
var 30000

A program komponensei (Mozi, Latogato, MoziMain) minden lényeges ponton (pl. film kezdete, időtúllépés, szál futásának vége, kommunikáció a felek között stb.) írjanak ki üzeneteket a sztenderd kimenetre, hogy lehessen látni a program futásának menetét. A főprogram várja be az összes Mozi és Latogato futásának végét, és ezután írja ki: "Foprogram vege.". Mivel mindegyik mozinak van időkorlátja, ehhez a kiíráshoz mindig el kell érkezni; ez legyen a legutolsó kiírás, ami megjelenik.