Search
Na dnešním cvičení si vyzkoušíme práci s vlákny. Stáhněte si zdrojové kódy lab06.zip pro cvičení.
Semafor lze označit za synchronizovaný čítač a používá se k přístup ke sdíleným prostředkům a registraci kolik prostředku výpočetní tok používá. Implementujte zjednodušenout verzi Semaforu ve třídě Semaphore, která má 3 metody—'acquire()', 'release()' a 'releaseAll()'. Semafor si bude udržovat proměnnou reprezentující čítač s výchozí hodnotou nula. Pokud je zavolána metoda 'release()', tak je hodnota čítače zvýšena o jedna.
Chování metody 'acquire()' je závislé na hodnotě vnitřního čítače. Pokud má čítač hodnotu větší než nula, tak se jeho hodnota sníží o jedna. Pokud je čítač nulový, tak voláná metody 'acquire()' blokuje vlákno až do té doby, než bude hodnota čítače zvýšena (pomocí 'release()').
Metoda 'releaseAll()' je singulární. Pokud je zavolána, pak začne semafor reprezentovat neomezené zdroje a čítač začne uvažovat nekonečnou hodnotu čítače, tedy metoda 'acquire()' nikdy neblokuje.
Úkolem cvičení je vytvořit program který bude paralelně sčítat čísla. Na tomto ilustrativním příkladu si ukážeme princip producer-consumer. V tomto případě přesně single producer, multiple consumer. Producer generuje data ke zpracování, consumer je pak asynchronně zpracovává.
V našem případě je producer reprezentován třídou 'NumberGenerator'. Data ke zpracování jsou vygenerována metodou 'generateAll()'. Každé datum je tvořeno polem 'long[]' o délce 100. Cílem consumerů je získávat tato data volání metody 'obtain()', sčítat je a výsledek zapsat do instance třídy 'NumberCollector' metodou 'addNumber()'. Consumer je částečně implementovaný ve třídě Worker.
Implementujte tento proces do těla metody 'startJob()' ve třídě 'Job'. Nezapomeňte zajistit vhodnout synchronizaci. Zároveň zajistěte, že data generovaná metodou 'generateAll()' budou asynchronně zpracovávana. Metoda vytvoří celkem čtyři 'Worker'y, počká na jejich ukončení a vypíše výsledek.
Propojte program s předpřiraveným GUI. Zajistěte správnou propagaci informace přes 'Observable'/'Observer' pattern. Použijte SwingWorker pro aktualizaci progress baru. Zajistěte funkčnost 'StopAction', tak aby přerušila probíhající výpočet.
Vzorové řešení bude dostupné na konci týdne, do té doby si lámejte hlavy.
lab_06_ants.zip lab_06_ants_solved.zip lab_07_ants_solved.zip
jumpingants.zip jumpingants_solution.zip
ants.zip