Ú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
- Čísla musí být ve správném pořadí.
- Každé číslo musí být samozřejmě ve výstupní posloupnosti právě jednou.
- V posloupnosti nesmí být žádná čísla navíc, např. -1 nebo 51.
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 x = 0L; x < 1_000_000L; x++);
- Častou chybou je přesáhnutí hodnoty 50 na konci, dejte si na to pozor.