Home |
last update: 1997-04-08 |
Multithreading v Jave
Základy
2 možnosti práce s thready:Â
-
buï podìdit od tøÃdy Thread
class SimpleThread extends Thread {Â
             public SimpleThread(String str) {Â
                 super(str);Â
             }Â
             public void run() {Â
                                ...Â
             }Â
         }Â
-
nebo implementovat rozhranà Runnable
class Sender implements RunnableÂ
{Â
 public void run()Â
 {Â
   ...Â
 }Â
 ...Â
}Â
Stavy a priorita threadù
Stavy threadu
Kdy se thread dotstane do stavu Not Runnable:Â
-
Je zavolána metoda sleep().
-
Je zavolána metoda suspend().
-
Thread se uspà pomocà wait().
-
Thread je zablokován nìjakou vstupnì/výstupnà operacÃ.
-
 stav threadu lze zjistit metodou isAlive()
Výbìr threadu, který pobìžÃ:Â
poznámka: priorita threadù v Javì je statická!Â
-
vždy se spustà thread s nejvyššà prioritou
-
pokud je vÃce se stejnou prioritou, dostávajà se ke slovu postupnì,
dle násladujÃcÃho mechanismu:Â
-
thread s vyššà prioritou se stane "Runnable"
v tomto pøÃpadì funguje VM preemptivnì - dosud bìžÃcà thread se okamžitì
pøerušÃÂ
-
bìžÃcà thread zavolá yield(), sleep(),
nebo skonèÃ
-
hostitelský systém podporuje tzv. "time-slicing" - preemptivnà multitasking
s èasovými kvanty a thread pøerušÃ
Volba priority threadu: metoda setPriority()Â
hodnota musà být v rozmezà MAX_PRIORITY (=10) a MIN_PRIORITYÂ
(=1)
Daemon Threads
tzv. "Daemon Threads"Â
- podobnì jako daemoni v Unixu, poskytuji služby ostatnÃm threadùm v
procesuÂ
- dokud bìžà alespoò jeden daemon thread, zùstane bìžet VM JavyÂ
- metody setDaemon(), isDaemon()Â
Skupiny (Groups) threadù
public Thread(ThreadGroup group, Runnable target)Â
public Thread(ThreadGroup group, String name)Â
public Thread(ThreadGroup group, Runnable target, String name)Â
PøÃklad:Â
ThreadGroup myThreadGroup = new ThreadGroup("My Group of Threads");Â
Thread myThread = new Thread(myThreadGroup, "a thread for my group");Â
Schéma možné hierarchie threadù
-
implicitnì je tedy každý thread èlenem skupiny "main"
-
lze však explicitnì øÃci, do které skupiny má patøit
-
zjištìnà v jaké je thread skupinì se provádà následujÃcà konstrukcÃ:
theGroup = myThread.getThreadGroup();Â
-
práce s thready a skupinami threadù sdružených v jedné skupinì lze
rozdìlit na zhruba následujÃci skupiny operacÃ:
-
Práce se sbÃrkami (collections)
-
Práce se skupinou - zmìny jejÃch atributù
-
Prace se všemy thready ve skupinì
-
ØÃzenà pøÃstupových práv (ve spolupráci se tøÃdou SecurityManager)
Synchronizace threadù v Jave
-
klÃèové slovo synchronized
-
na úrovni sekce - myšleno metody objektu, teoreticky by mìlo
jÃt napsat i toto:
...Â
synchronized{Â
   ...Â
}Â
leè v dokumentaci to nedoporuèujà   :-)Â
-
jestliže deklarujeme nìjakou metodu objektu jako synchronized, je
instanci objektu pøiøazen jednoznaèný tzv. Monitor;
vechvÃli volánà metody deklarované jako synchronized zÃskáva
thread který tuto metody zavolat monitor, a žádný jiný thread nemùže zavolat
žádnou jinou metodu daného objektu, definovanou jako synchronized.
-
monitor se tedy váže k instanci objektu.
-
monitor je tzv. reentrantnÃ; znamená to, že thread, který vlastnÃ
pro danou chvÃli monitor, mùže volat dalšà synchronized metody
daného objektu.
-
thread, který se pokoušà spustit synchronized metodu
objektu, pro který nemá monitor, je automaticky pozastaven
-
avšak vìtšinou potøebujeme synchronizaci na trochu vyššà úrovni
- splnìnà urèitých podmÃnek. K tomu sloužà metody wait() a dvojice metod
notify(), notifyAll(). (Ukázka viz nÞe v pøÃkladu.)
Tedy pokud nenà splnìna urèitá podmÃnka a thread nemùže pokraèovat v
èinnosti, uspà se metodou wait(). A èeká na zmìnu situace.Â
Thread, který situaci zmìnÃ, zavolá buï metodu notify(), pøÃpadnì notifAll().
A tÃm probudà èekajÃcà thread/thready.Â
PøÃklad:Â
Problém producent - konzument v JaveÂ
 Prvnà - úplnì špatná - varianta Â
 Tøetà - správná - varianta Â
Zdroje:Â
Java
TutorialÂ
JDK
1.1 DocumentationÂ
Softwarové noviny 1/97Â
Â