Úloha 4
Název: Vícevláknová aplikace
Počet bodů: 3
Způsob řešení: Úlohu řeší každý člen týmu zvlášť
Úlohu nelze odevzdávat dodatečně!
Zadání
Napište jednoduchý program, který vytvoří tři vlákna. Tato vlákna budou generovat společnou řadu čísel od 0 do 50 a vypisovat je na standardní výstup ve tvaru
vlakno 1: 0
vlakno 1: 1
vlakno 3: 2
vlakno 2: 3
...
vlakno 1: 50
Tipy a další pokyny
Při řešení úlohy dodržujte tyto tyto pokyny:
- Třídu implementující chování vláken nerealizujte jako potomka třídy
Thread
, ale jako třídu implementující rozhraní Runnable
.
- Všechna tři vlákna realizujte pomocí jedné společné třídy (tj. nevytvářejte pro každé vlákno novou třídu, pouze novou instanci společné třídy).
- Pojmenování vlákna udělejte pomocí třídy Thread, ta už obsahuje atribut name. Jméno aktuálně běžícího vlákna pak získáte pomocí Thread.currentThread().getName().
- Dejte si pozor, co všechno musíte synchronizovat. Chyby v synchronizaci budou předmětem bodové penalizace. Chybou v synchronizaci není pouze synchronizace nedostatečná, ale také synchronizace nadbytečná.
- Pokud by se stalo, že přepínání kontextu bude pomalé a všechna čísla vygeneruje jedno vlákno, vložte na vhodné místo (případně na více vhodných míst) aktivní čekací smyčku. Za normálních okolností byste samozřejmě ve svém programu aktivní čekací smyčku nikdy používat neměli, protože zbytečně spotřebovává strojový čas procesoru a snižuje výkon aplikace. V tomto případě by ale použití vhodnější metody (např. volání Thread.sleep()) vynutilo přepnutí kontextu a zamaskovalo by to veškeré případné chyby v synchronizaci. Pozor! Ani to, že použijete aktivní čekací smyčku negarantuje, že jste opravdu žádnou chybu v synchronizaci neudělali. Aktivní čekací smyčka pouze výrazně zvyšuje šanci, že se vaše případné chyby v synchronizaci projeví. (V čekací smyčce použijte proměnnou typu long, má to lepší účinek na přepínání kontextu než int.) for (long l = 0l; l < 1000000; l++) {}
- Až budete mít program hotový, nejspíš zjistíte, že se čísla nevypisují ve správném pořadí. Uložte si tuto verzi programu a zkuste jej pak upravit tak, aby bylo dodrženo i pořadí čísel. Při opravování pak ukažte obě verze (první by měla být jednodušší, druhá o něco složitější).
- Každé číslo musí být samozřejmě ve výstupní posloupnosti právě jednou.
- Častou chybou je přesáhnutí hodnoty 50 na konci, dejte si na to pozor.