Sunteți pe pagina 1din 6

Lucrarea 5

Fire de Execuie n Java.


Mecanisme de Sincronizare.
n aceast lucrare vor fi prezentate mecanismele Java pentru programarea concurent.
Fire de Execuie
Exist dou moduri n care pot fi create noi fire de execuie n Java. Primul mod const n
crearea unei subclase a clasei Thread i suprascrierea metodei run!". Pentru fiecare fir de
execuie pe care dorim s#l rulm trebuie s crem un exemplar din noua clas i s#l
lansm apel$nd metoda start!" a noului exemplar%
public class &irThread extends Thread '
public void run!"'((aceasta este metoda care se execut concurent
)hile!true"
*+stem.out.println!,-ar eu sunt un firicel,".
/
public static void main!*tring01 arg"'
&irThread f2ne) &irThread!".
f.start!".((pornim run#ul lui f
)hile!true"
*+stem.out.println!,eu sunt firul principal,".
/
/

3eoarece n Java nu avem motenire multipl mecanismul anterior nu poate fi folosit
ntotdeauna. 3e aceea mai avem un mod de creare a unui nou fir de execuie% crearea unei
noi clase care s implementeze interfaa 4unnable5 noua clas trebuind s implementeze
metoda run!". Pentru a porni un nou fir de execuie se creeaz un exemplar din noua clas
care va fi pasat ca parametru la crearea unui obiect din clasa Thread. &irul se lanseaz n
acelai mod5 apel$nd metoda start a noului obiect Thread.
public class &ir4unnable implements 4unnable '
(66 7reates ne) &ir4unnable 6(
public void run!"'((firul care se execut concurent
)hile!true"
*+stem.out.println!,-ar eu sunt un firicel,".
/
public static void main!*tring01 arg"'
&ir4unnable f2ne) &ir4unnable!".((exemplarul care trebuie pasat firului
ne) Thread!f".start!".((crem firul i#l pornim
)hile!true"
*+stem.out.println!,eu sunt firul principal,".
/
/
&iecare fir de execuie are o prioritate5 care este un numr din intervalul
08-9:P4-;4-T<58=>:P4-;4-T<1 i care poate fi modificat cu a?utorul metodei%
public final void setPriority!int ne)Priorit+"
n general5 atunci c$nd exist o competiie pentru resurse sunt preferate firele care au
prioritate mai mare dar nu exist nici o garanie n acest sens5 i nici c firul cu prioritatea
cea mai mare va fi mereu n execuie. 3eci nu acesta va fi mecanismul care va fi folosit
pentru definirea zonelor critice.
@n fir poate fi setat ca fiind demon5 nainte de lansarea sa n execuie5 folosind metoda%
public final void setDaemon!boolean on"
; aplicaie ?ava ruleaz p$n c$nd%
*e execut cu succes metoda exit!" a clasei 4untime.
Ai#au terminat execuia toate firele nemarcate ca fiind demon.
&irele pot fi grupate folosind obiecte din clasa ThreadBroup5 prin folosirea unui
constructor adecvat. @n grup poate s includ alte grupuri5 acestea av$nd o structur
arborescent5 relaiile ntre grupuri fiind de genul printe#copil. @n fir poate avea acces la
informaiile legate de propriul grup5 dar nu la informaiile legate de alte grupuri5 aici
incluz$ndu#se i printele.
3ac nu se specific un anumit grup la crearea obiectului din clasa Thread5 acesta va fi
considerat ca fc$nd parte din grupul implicit.
Mecanisme de Sincronizare
1
7ea mai simpl metod de sincronizare const n folosirea unei metode ?oin%
C. public final void ?oin!" thro)s -nterruptedException
D. public final void ?oin!long millis" thro)s -nterruptedException
E. public final void ?oin!long millis5 int nanos" thro)s -nterruptedException
Prima metod ateapt terminarea respectivului fir de execuie5 a doua ateapt cel mult
millis milisecunde iar cea de#a treia mai ateapt i nanos nanosecunde. 3ac firul a fost
ntrerupt de un altul este aruncat o excepie -nterruptedException5 dup care fanionul
corespunztor este resetat. @n exemplu de utilizare al acestei metode este urmtorul5 care
adun elementele unui vector%
(6
6 adFector.?ava
6
6 7reated on GC aprilie DGGD5 CH%CI
6(
(66
6
6 Jauthor st
6 Jversion
6(
public class adFector extends Thread '
static int v012ne) int0CGG1.((vectorul pe care l adunm
static int rez012ne) int0H1.((aici memorm rezultatele produse de fire
private int index.((indexul firului de execuie
(66 7reates ne) adFector 6(
public adFector!int numar" '((iniializm indexul firului de execuie
index2numar.
/
public void run!"((asta#i firul
'
int i.
rez0index12G.
C
n aceast lucrare este prezentat un rezumat. Pentru o descriere exhaustiv v recomand Java Kanguage
*pecification5 cel puin%
L.E.C.H volatile &ields
L.H.E.M s+nchronized 8ethods
CH.CL The s+nchronized *tatement
CN Threads and KocOs
for!i2index6DP.iQ!indexRC"6DP.iRR"((algoritm clasic dar nu lucreaz dec$t cu o
parte din
rez0index1R2v0i1. ((vector
/
(66
6 Jparam args the command line arguments
6(
public static void main !*tring args01" '
int i.
for!i2G.iQCGG.iRR"((iniializm vectorul
v0i12iRC.
adFector fire012ne) adFector0H1.
for!i2G.iQH.iRR"
fire0i12ne) adFector!i". ((crem cele patru fire de execuie
for!i2G.iQH.iRR"
fire0i1.start!".((le pornim
int suma2G.
for!i2G.iQH.iRR"((adunm rezultatele produse de fire
'
tr+'
fire0i1.?oin!".((ateptm s moar firul i
/
catch!-nterruptedException ie"
'/
sumaR2rez0i1.((adunm
/
*+stem.out.println!suma".
/
/
&iecare fir de execuie pstreaz o copie de lucru pentru fiecare variabil cu care
lucreaz5 variabilele fiind parta?ate n memoria principal. n timpul execuiei unui fir5
acesta opereaz asupra acestor copii de lucru5 memorate n memoria de S lucru.
7el mai simplu mod n care se poate obine o sincronizare ntre memoria de lucru i
memoria principal const n declararea unei variabile ca fiind volatile
D
. n cazul unei
variabile declarate ca fiind volatile firul de execuie trebuie s#i armonizeze copia de
lucru cu copia principal de fiecare dat c$nd acceseaz variabila.
n plus5 operaiile efectuate n memoria principal n numele unui fir asupra uneia sau a
mai multor variabile volatile sunt executate n aceeai ordine n care le#a cerut firul de
execuie.
@n mecanism mai sigur de sincronizare este dat de folosirea s+nchronized. ; metod
declarat s+nchronized nu se va executa dec$t atunci c$nd firul respectiv este
,proprietarul, obiectului asociat metodei5 la final obiectul fiind eliberat. n cazul unei
D
=celai specificator este prezent i n 75 dar funcionalitatea acestuia este asigurat de compilator5 ceea ce
face ca mecanismul s nu fie prea sigur n cazul n care exist mai multe procesoare.
metode nestatice5 se ncearc blocarea exemplarului a crui metod sincronizat este
apelat. n cazul unei metode statice5 se ncearc blocarea obiectului 7lass. 8ecanismul
este similar cu cel al mutexului5 dei este de fapt o extensie a monitorului. Exemplu%
class Test '
int count.
s+nchronized void bump!" ' countRR. /
static int class7ount.
static s+nchronized void classTump!" '
class7ountRR.
/
/

=ceeai semnificaie se poate obine folosind instruciunea synchronized%
class TumpTest '
int count.
void bump!" '
s+nchronized !this" '
countRR.
/
/
static int class7ount.
static void classTump!" '
tr+ '
s+nchronized !7lass.for9ame!,TumpTest,"" '
class7ountRR.
/
/ catch !7lass9ot&oundException e" '
...
/
/
/
n cazul unei instruciuni de genul%
s+nchronized ( Expression ) Block
mai nt$i se evalueaz expresia care trebuie s aib ca rezultat o referin non#nul5 dup
care se ateapt blocarea obiectului coninut de referin5 put$ndu#se apoi trece la
execuia blocului de instruciuni5 iar n final se efectueaz deblocarea.
3eoarece acest mecanism nu este suficient5 n clasa ;b?ect avem c$teva metode care pot
fi folosite pentru sincronizare%
C. public final void )ait!" thro)s -nterruptedException
D. public final void )ait!long timeout" thro)s -nterruptedException
E. public final void )ait!long timeout5 int nanos" thro)s -nterruptedException
H. public final void notif+!"
P. public final void notif+=ll!"
8etodele )ait fac ca firul apelant s atepte p$n c$nd un alt fir apeleaz metoda notif+!"
sau notif+=ll!" pentru acelai obiect sau5 dup caz5 a expirat timpul specificat.
&irul apelant al acestor metode trebuie s fie proprietarul monitorului obiectului cruia i
se apeleaz metoda )ait. &irul elibereaz monitorul i ateapt s fie notificat sau
expirarea timpului dup care ateapt reblocarea monitorului nainte de a continua
execuia.
8etoda notif+!" ,trezete, cel mult un fir5 aleg$ndu#l n mod arbitrar atunci c$nd sunt mai
multe cele care ateapt dup acelai obiect. 3ac dorii s le deblocai pe toate5 folosii
metoda notif+=ll!".
8ecanismul este similar cu variabilele condiie de la Kinux5 de aceea )ait poate fi folosit
ntr#un context similar cu urmtorul%
s+nchronized!exemplar"'
S.
exemplar.)ait!".
S
/
Probleme Propuse.
C. * se determine dac un element apare ntr#un vector oarecare5 folosind n
procesoare.
D. * se determine pe ce poziii apare un element ntr#un vector oarecare5 folosind n
procesoare.
E. ; resurs poate fi utilizat de dou tipuri de procese% albe i negre. =tunci c$nd
resursa este folosit de procese albe ea nu mai poate fi folosit de procese negre.
Este valabil i reciproca. * se implementeze accesul la resurs5 evit$ndu#se
nfometarea.
H. * se sorteze elementele unui vector cu n procesoare.
P. * se genereze toate numerele prime mai mici dec$t o anumit valoare5 folosind n
procesoare.
M. * se coordoneze semafoarele de la captul unui tunel cu o singur band5
folosindu#se de senzorii de la fiecare capete care semnalizeaz intrarea i ieirea
mainilor5 astfel nc$t s nu se permit intrarea pe la un capt c$t timp mai sunt
maini n tunel merg$nd n sens invers. 8ainile s fie simulate cu a?utorul firelor
de execuie.

S-ar putea să vă placă și