Warning
This page is located in archive.

6 - Vlákna

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í.

  • pro vyučující: 06

Semafor

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.

Při implementaci semaforu využijte metody 'wait()' a 'notifyAll()' na uspávání a probouzení vláken.

Paralelní sčítání čísel

Ú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.

Využijte metodu 'Thread#join()' na vyčkání na konec práce Workerů.

Propojení s GUI

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.

Toto cvičení je zaměřeno více na základní nástroje pro práci s vlákny. Tato úloha by se dala řešit pomocí třídy a metody 'ExecutorService#submit()'. V praxi preferujte použití nástrojů z Java Frameworku (a jiných), ale stále je důležité vědět co se skrývá uvnitř a jak to funguje.

Podklady pro cvičení

Cvičení 203, 204

Cvičení 105, 201

Cvičení 102, 103

courses/a0b36pr2/labs/6_-_vlakna.txt · Last modified: 2016/04/08 10:33 by mrvajaku