Vlákna v Javě

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Přidána komunikace mezi vlákny, upravena struktura...)
m (Implementace v Javě: Oprava vzhledu)
Řádka 26: Řádka 26:
 
  run()
 
  run()
 
*Popisuje, co má vlákno vykonávat.
 
*Popisuje, co má vlákno vykonávat.
<div class="Varovani>Tuto metodu nikdy nevoláme přímo, spustí ji třída Thread sama při volání metody <code>start()</code>.</div>
+
<div class="Varovani">Metodu <code>run()</code> nikdy nevoláme přímo, spustí ji třída <tt>Thread</tt> sama při volání metody <code>start()</code>.</div>
 
  start()
 
  start()
 
* Vytvoří vlákno a spustí v něm kód metody <code>run()</code>.
 
* Vytvoří vlákno a spustí v něm kód metody <code>run()</code>.
Řádka 37: Řádka 37:
 
* Viz [[#Komunikace mezi vlákny|Komunikace mezi vlákny]]
 
* Viz [[#Komunikace mezi vlákny|Komunikace mezi vlákny]]
 
<div class="Varovani">Metoda <code>stop()</code> je zastaralá (depricated) a neměla by se používat! Vlákno by mělo skončit vždy samo ve vhodný okamžik na základě ukončení metody <code>run()</code>.</div>
 
<div class="Varovani">Metoda <code>stop()</code> je zastaralá (depricated) a neměla by se používat! Vlákno by mělo skončit vždy samo ve vhodný okamžik na základě ukončení metody <code>run()</code>.</div>
 
  
 
== Spuštění vlastního vlákna ==
 
== Spuštění vlastního vlákna ==

Verze z 12. 2. 2015, 10:05


Obsah

Výhody a nevýhody práce s vlákny

Výhody
Problémy
Kdy má smysl?


Implementace v Javě


Metody třídy Thread
run()
Metodu run() nikdy nevoláme přímo, spustí ji třída Thread sama při volání metody start().
start()
Thread.sleep(int time)
stop() — nedoporučuje se!!!
Metoda stop() je zastaralá (depricated) a neměla by se používat! Vlákno by mělo skončit vždy samo ve vhodný okamžik na základě ukončení metody run().

Spuštění vlastního vlákna

Postup
  1. 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.
  2. Vytvoříme instanci třídy Vlakno.
  3. Vytvoříme instanci třídy Thread.
    • V konstruktoru předáme instanci třídy Vlakno.
  4. 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);


Z více vláken nelze používat


Modifikátor synchronized

synchronized {...}


Synchronizace kolekce

List<Prvek> data = Collections.synchronizedList(new ArrayList<Prvek>()); 
synchronized(data) {
   Iterator i = data.iterator(); // Must be in synchronized block
   while (i.hasNext())
      foo(i.next());
}


Časování — třída Timer

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();


Komunikace mezi vlákny

Příklad — Pravidelný výpis stavu výpočtu

Komunikace-vlaken.png


Další informace

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje