Documente Academic
Documente Profesional
Documente Cultură
1 Java 2014
1 Java 2014
Premise
Programarea concurenta in Java tine cont de
constrangerile impuse de sistemul de operare
procesele nu pot partaja date
firele de executie (thread) din acelasi proces pot
orientarea pe obiecte
datele sunt grupate in obiecte impreuna cu operatiile
care le manipuleaza
Discutam in continuare ambele aspecte
Procese
Proces
Proces 1
Proces 2
Process
Control Block
Process
Control Block
Cod
Cod
Date
Date
Stiva
Stiva
Fire de executie
Un proces poate avea mai
multe fire de executie
Fir de executie (thread):
Process
Control Block
Cod
Firele de executie
impart acelasi spatiu de
adrese;
au in comun: zonele de cod si
date din memorie, resursele
procesului
zona de stiva reprezinta
starea curenta a thread-ului si
este proprie thread-ului
Date
Thread 1
Thread 2
Thread
Control Block
Thread
Control Block
Stiva
Stiva
Executia thread-urilor
P1
Thread 1
P2
Sisteme multiprocesor:
executie in paralel
Thread 2
t
Sisteme uniprocesor:
T1 T2
executie secventiala
planificarea este realizata
de sistemul de operare
P1
t
sleep(100);
}
}
mt.start();
Thread t =
Thread.currentThread();
t.sleep(100);
}
}
mmt.start();
oc
Algoritmmi paraleli si distribuiti
Rezultat posibil
GATA main!
2 a = 0 b =
1 a = 0 b =
1 a = 2 b =
2 a = 3 b =
1 a = 4 b =
2 a = 5 b =
GATA!
GATA!
0
0
1
2
3
4
Scenariu de executie
class TestSincronizare extends Thread {
public static void main (String args[]) {
FirNeSincronizat f1 = new FirNeSincronizat(1);
FirNeSincronizat f2 = new FirNeSincronizat(2);
f1.start(); f2.start();
System.out.println(GATA main!);
}
}
Rezultat
GATA main!
2 a = 0 b =
1 a = 0 b =
1 a = 2 b =
2 a = 3 b =
1 a = 4 b =
2 a = 5 b =
GATA!
GATA!
0
0
1
2
3
4
oc
Algoritmmi paraleli si distribuiti
Efectul sincronizarii
doua secvente sincronizate de acelasi obiect nu se pot executa in
acelasi timp
adica operatiile celor doua secvente sa se intreteasa
cand un thread executa o secventa sincronizata de un obiect, alte
threaduri care incearca sa execute secvente sincronizate de
acelasi obiect se blocheaza pana cand executia primei secvente
se termina
Ex. cand f1 executa secventa sincronizata de obiectul o, f2 nu
poate executa secventa sincronizata de acelasi obiect (chiar daca
f1 este in "sleep")
Metoda wait()
Permite manevrarea zavorului asociat cu un obiect
La apelul metodei wait() pentru un obiect o de catre un
thread t:
se deblocheaza zavorul asociat cu o; t este adaugat
la un set de thread-uri blocate, wait set-ul lui o
daca t nu detine zavorul pentru o:
IllegalMonitorStateException
t va continua executia doar cand va fi scos din wait
set-ul lui o, prin:
o operatie notify() / notifyAll(),
expirarea timpului de asteptare, sau
o actiune dependenta de implementare
Algoritmmi paraleli si distribuiti
Notificari
Metode: notify(), notifyAll()
La o notificare apelata din thread-ul t pentru obiectul o:
notify(): un thread u din wait set-ul lui o este scos si
repus in executie
notifyAll(): toate thread-urile sunt scoase din wait
set-ul lui o dar numai unul va putea obtine zavorul
daca t nu detine zavorul pentru o:
IllegalMonitorStateException
Producator-consumator - pseudocod
var buf: int, p: int :=0, c:int :=0;
co Producer:: var a: array[1:n] of int;
do p<n -> <await p=c>;
buf := a[p+1];
p := p+1
od
Consumer:: var b: array [1:n] of int;
do c<n -> <await p>c>;
b[c+1] := buf;
c := c+1
od
oc
4 October 2010
22
Implementare Java
buf implementat
ca o clasa
ZonaTampon cu
doua metode:
Produ
Consuma
valorile a
sunt
produse la
executie
valorile b sunt
tiparite
23
// valoare indisponibila
try {
wait();
} catch (InterruptedException e) {}
}
disponibil = false;
notify();
return buf;
}
Algoritmmi paraleli si distribuiti
try {
wait();
} catch (InterruptedException e) {}
}
buf = valoare;
disponibil = true;
notify();
}
}
Exemplu Producator
Class Producator extends Thread {
private ZonaTampon Tampon;
private int numar;
// ID-ul producatorului
public Producator(ZonaTampon z, int numar) {
Tampon = z; this.numar = numar;
}
public void run() {
for (int i = 0; i < 10; i++) {
Tampon.Produ(i);
System.out.println(Producator + this.numar + a
transmis: + i);
try {
sleep((int)Math.random() * 100));
} catch (InterruptedException e) {}
}
}
}
Algoritmmi paraleli si distribuiti
Exemplu - Consumator
class Consumator extends Thread {
private ZonaTampon Tampon;
private int numar; // ID-ul consumatorului
public Consumator(ZonaTampon z, int numar) {
Tampon = z;
this.numar = numar;
}
public void run() {
int valoare = 0;
for (int i = 0; i < 10; i++) {
valoare = Tampon.Consuma();
System.out.println(Consumator + this.numar + a
preluat + valoare);
}
}
}
Algoritmmi paraleli si distribuiti
Exemplu - Test
public class TestProducatorConsumator {
public static void main(String[] args) {
ZonaTampon z = new ZonaTampon();
Producator p1 = new Producator(z, 1);
Consumator c1 = new Consumator(z, 1);
p1.start();
c1.start();
}
}
CountdownLatch
similar cu bariera, are un contor, dar decrementarea contorului
este separata de asteptarea ajungerii la zero thread-urile care
gasesc zero trec fara sa astepte
Exchanger
rendezvous cu schimb de valori in ambele sensuri intre threaduri
Algoritmmi paraleli si distribuiti
Referinte
[Ath02] Irina Athanasiu, Java ca limbaj pentru programarea
distribuita, MatrixRom, 2002
[JLS05] http://java.sun.com/docs/books/jls/ - The Java Language
Specification
[J2SE05N] http://java.sun.com/developer/technicalArticles/
releases/j2se15/ - J2SE 5.0 in a Nutshell
http://www.cs.cf.ac.uk/Dave/C/node29.html - Threads: Basic
Theory and Libraries