Vlákna v Javě
Z MiS
				
				
				
				
																
				
				
								
				
| Obsah | 
Výhody a nevýhody práce s vlákny
- Výhody
- Využití výkonu počítače (Za jakých okolností?)
- Oddělení nesouvisejících úkolů v aplikaci.
- Problémy
- Nutnost synchronizace + riziko uváznutí — deadlock.
- Výrazně obtížnější ladění programu!!!
- Kdy má smysl?
-  Když provádím několik relativně nezávislých činností. 
- Každá činnost může běžet v jiném jádře procesoru.
 
- Jeden kus kódu má běžet stejně rychle bez ohledu na délku zpracování jiného.
- Animace na pozadí.
- Dvě okna stejného programu.
Implementace v Javě
- Vlákno je vždy provázáno s instancí třídy Thread
- Postup
-  Implementujeme v naší třídě (třeba Vlakno) rozhraní Runnable.
- Musíme doplnit metodu public void run().
- V metodě run() napíšeme kód, který má vlákno provádět.
 
- Vytvoříme instanci třídy Vlakno.
-  Vytvoříme instanci třídy Thread.
- V konstruktoru předáme instanci třídy Vlakno.
 
- Zavoláme metodu start() třídy Thread.
- Popis chování vlákna
class Vlakno implements Runnable {
   ...
   public void run() {
      ... co se má dělat ve vlákně ...
   }
   ...
}
- Spuštění vlákna
Vlakno v = new Vlakno(); Thread t = new Thread(v);
Metody třídy Thread
run()
- Popisuje, co má vlákno vykonávat.
- Nevolá se přímo!
start()
- spustí vlákno
Thread.sleep(int time)
- Třídní metoda.
- Zastaví aktuální vlákno na stanovený počet milisekund.
- Můžeme volat kdekoli, i v programu, který vlákna nevyužívá!
Z více vláken nelze používat
- Greenfoot
- Není Thread-safe!!!!
- Nevolejte z jiného vlákna funkce Greenfootu!
 
- ArrayList, kolekce
- Lze zasynchronizovat.
 
- Scanner
Modifikátor synchronized
-  Pro metodu způsobí, že metoda bude prováděna jako celek.
- Provádění metody nebude přerušeno přepnutím do jiného vlákna.
 
-  Pro blok
- Používá zámek zadaného objektu.
- Může se pak dělat jen jeden z bloků
 
synchronized {...}
Synchronizace kolekce
List<Prvek> data = Collections.synchronizedList(new ArrayList<Prvek>());
- Ale je třeba dát iteraci do synchronizovaného bloku:
synchronized(data) {
   Iterator i = data.iterator(); // Must be in synchronized block
   while (i.hasNext())
      foo(i.next());
}
Třída Timer
-  V Javě více variant, například: javax.swing.Timer.
- S pravidelnými časovými intervaly vyvolává zadaný kód.
- Přidáme posluchače (listenery, implementují rozhraní ActionListener).
- Timer ve stanovených intervalech posílám všem posluchačům zprávu actionPerformed.
- Příprava posluchače
class Posluchac implements ActionListener() {
   public void actionPerformed(ActionEvent e) {
      ... co se má pravidelně vykonat ...
   }
}
- Spuštění časování
Timer t = new Timer(new Posluchac(), 1000); t.start();
