| Home |
last update: 1997-04-08 |
Multithreading v Jave
Základy
2 monosti 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á!
-
vdy 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 okamitì
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 sluby 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 moné hierarchie threadù
-
implicitnì je tedy kadý thread èlenem skupiny "main"
-
lze vak explicitnì øíci, do které skupiny má patøit
-
zjitìní v jaké je thread skupinì se provádí následující konstrukcí:
theGroup = myThread.getThreadGroup();
-
práce s thready a skupinami threadù sdruený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 vemy 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 - myleno metody objektu, teoreticky by mìlo
jít napsat i toto:
...
synchronized{
...
}
leè v dokumentaci to nedoporuèují :-)
-
jestlie 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
-
avak vìtinou 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