Sunteți pe pagina 1din 5

CURS 11

Concurenta in Java Introducere in programarea concurenta Programele scrise pana acuma: secventiale Programare concurenta: mai multe fire de executie care ruleaza in paralel Exemple de utilizare a modelului concurent de executie in Java: Sistemul web clasic JSP Swing si SWT au mecanisme pentru suport concurenta Motive pentru a realiza programe concurente Executie mai rapida in conditiile programarii multiprocesor mbunatatirea code design !oncurenta induce un cost: complexitate sporita a programelor Executia mai rapida a programelor Tendinta curenta: numar mai mare de core"uri# in conditiile plafonarii vitezei c$ipurilor Prin distribuirea ta%urilor pe procesoare se creste throughput !$iar in conditiile single core# programele concurente se pot executa mai rapid &datorita situatiilor bloc%ing' (aca un tas% &sau t$read' nu poate continua &de ex) datorita operatiilor de *+'# se spune ca acel tas% e blocat) event"driven programming: realizarea de interfete grafice responsive# in conditiile in care prelucrarile asociate unor evenimente dureaza ,n proces este un program de sine statator cu propriul spatiu de adrese ,n sistem de operare multi-tasking poate sa ruleze mai multe procese la un moment dat &datorita sc$imbarii periodice a !P, de la un proces la altul' implementarea concurentei la nivel de S+ mplementarea concurentei la nivel de mediu de programare: presupune existenta unor resurse comune si coordonarea utilizarii acestor resurse de catre t$readuri) Mai mult# procesele pot comunica intre ele Tipuri de sisteme paralele

Abordari ale concurentei in LP (I) Tas%urile concurente sa fie izolate unele de altele &fiecare functie concurenta nu produce side effects' modelul distributed memor- ex) Erlang &Erricson' !*!..: for%: se creaza procese separate gestionate de catre S+ Java: in cadrul unui singur proces gestionat de catre S+# se creaza mai multe tas%uri prin t$reading !*!.. * Java modelul s$ared memorAbordari ale concurentei (II) Java t$reading este preemtive: mecanismul de sc$eduling furnizeaza o felie de timp procesor fiecarui t$read# prin intreruperea periodica a t$readului care se executa si sc$imbarea contextului de executie catre un alt t$read ntr"un sistem multit$reading cooperativ fiecare t$read isi lasa controlul catre alt t$read la un anume moment /0 programatorul trebuie sa insereze un soi de -ield Code design ,nele probleme &precum cele de simulare' sunt concurente prin definitia lor !$iar daca sistemul pe care programul se executa are un singur !P,# programele concurente au o claritate mai mare Java t$reading este preemtiv /0 suport pentru numar limitat de t$readuri &de ordinul zecilor' "0 poate fi limitativ in anumite situatii !ooperative multit$reading: nu exista o limita a tas%urilor independente care pot rula la un moment dat !oncurenta este benefica daca se lucreaza cu ar$itecturi moderne de tip messaging " sisteme distribuite Prin messaging se realizeaz coordonarea proceselor intre ele &fara sa fie nevoie de parta1area de resurse' T reading in Java T$read: un flux secvential de executie dintr"un proces ntr"un sistem multi"t$reading# un proces poate contine mai multe t$readuri concurente Programatorul proate programa fiecare dintre aceste t$readuri ca si cum ar avea intreg procesorul la dispozitie Pentru a defini un tas% trebuie implementara interfata !unnable n general# metoda run a aceste interfete are o bucla care se executa atata timp cat este necesar 2ct main are alocat propriul t$read) Pt un tas% nou# trebuie sa se creeze un obiect dintr"o clasa care implementeaza 3unnable

Terminologie n Java exista distinctie intre tas%ul care este executat si t$readul care executa acest tas% +biectele care implementeaza 3unnable sunt tas%uri# iar t$readurile a1uta la executia acestor tas%uri !rearea unui t$read este o operatie costisitoare &bazata low"level pe conceptul de pt$read din !' "0 are sens ca sa gestionam t$readurile cu gri1a "0 distinctia tas% t$read are sens Terminologie: Tas%: un anume 1ob care trebuie realizat T$read: mecanismul care executa tas%ul) Clasa T read Pentru a crea un t$read# trebuie furnizat un obiect de tip 3unnable in constructorul unui obiect de tip T$read Metoda start a clasei T$read realizeaza toate initializarile necesare si apoi apeleaza metoda run a obiectului 3unnable agregat) Metoda run este apelata intr"un fir nou de executie Mecanismul pentru lansarea t$readurilor in executie este non"deterministic &nu putem garanta ordinea in care sc$edulerul aloca procesorul diverselor tas%uri' T$read)-ield&' "0 solicita J4M sa dea controlul unui alt t$read din programul curent pentru a solicita invocarea sc$edulerului 5arbage collectorul nu va colecta un t$read nereferit decat dupa ce acesta isi termina executia propriului run "ariatii la crearea taskurilor 6) se creaza o clasa care implementeaza 3unnable) ,n obiect din aceasta clasa e transmis in constructorul unui obiect de tip T$read 7) se mosteneste din clasa T$read# si se suprascrie metoda run 8) se creaza o clasa care implementeaza 3unnable) 9ceasta clasa agrega un obiect de tip T$read construit prin new T$read&t$is' 9tentie: la metodele 7 si 8 tas%urile sunt pornite din constructor &cu start') "0 e problematic# t$readul isi poate incepe executia inainte ca constructorul sa se termine /0 se prefera varianta 6 si utilizarea executorilor !lasele care implementeaza 3unnable sau exting T$read pot fi scrise si ca si clase inner &eventual anonime' ::: Executors Java furnizeaza un nivel intermediar intr"un client si tas%urile pe care acesta le executa) n loc ca clientul sa apeleze tas%urile in mod direct# un obiect intermediar &executor' va apela aceste tas%uri indirect Executors gestioneaza ciclul de viaza a tas%urilor asincrone fara sa fie nevoie sa gestionam explicit ciclul de viata a unui obiect T$read
3

Se creaza un ExecutorService prin apelarea unei metode specifice a clasei Executors Metoda s$utdown: previne ca alte tas%uri sa fie trimise catre executorService spre executie Tipuri de ExecutorService: FixedThreadPool: fixeaza de la inceput numarul de t$readuri utilizate pentru executia tas%urilor) Este o metoda deosebit de eficienta pt ca over$eadul cu crearea t$readurilor este realizat la crearea obiectului de tip ExecutorService CachedThreadPool: permite un numar variabil de t$readuri) 4a opri crearea de t$readuri noi pe masura ce t$readurile vec$i sunt reciclate SingleThreadExecutor este un 2ixedT$readPool cu un singur t$read &de obicei pentru long"lived t$read ex) Treaduri care asculta un soc%et' !eturnarea de valori din taskuri nterfata !allable: metoda call care trebuie sa returneze o valoare +biectele !allable trebuie apelate de metoda submit a unui ExecutorService Metoda submit produce un obiect de tip 2uture parametrizat cu tipul rezultatului specific returnat din tas% +biectul 2uture poate fi interogat cu metoda is#one() pentru a vedea daca metoda call a produs rezultatul) Metoda get() a obiectului 2uture obtine rezultatul produs de metoda call) (aca rezultatul nu este disponibil# metoda get este de tip bloc%ing &pana cand rezultatul devine disponibil' T readuri daemon ,n t$read daemon furnizeaza un serviciu general programului care ruleaza in bac%ground pe durata executiei programului ntr"un program# cand toate t$readurile non"daemon isi termina executia# programul este terminat# J4M omorand toate t$readurile daemon (aca exista t$readuri non"daemon care se executa# programul nu se termina Main este executat intr"o instanta non"daemon ,n t$read se marc$eaza ca si daemon inainte ca sa se inceapa executia acestuia cu start T$read2actor-: interfata pentru crearea de t$readuri la cerere) T$readurile pot fi personalizate &de exemplu# t$readuri daemon' metoda newT$read +biecte implementand T$read2actor- pot fi furnizate ca si constructori pentru Executori; executor service"ul rezultat va utiliza acest t$read2actor- pentru crearea noilor t$readuri &cu metoda newT$read' (aca un t$read daemon creaza alte t$readuri# acestea devin daemon la randul lor Crearea unor inter$ete gra$ice responsive
4

nterfetele grafice trebuie sa raspunda rapid inputului utilizatorului c$iar daca acesta presupune calcule sofisticate si de lunga durata Pentru a realiza un program care raspunde inputului utilizatorului# tas%ul de lunga durata trebuie rulat in t$read now &metoda run' Prinderea exceptiilor (aca apare o exceptie in metoda run# aceasta se va propaga pana la consola# in cazul in care exceptia nu e rezolvata in run Problema e rezolvata cu Executors Exceptiile aruncate de metoda run nu pot fi prinse cu tr-"catc$ in 1urul comenzii exec a executorului Prinderea unei exceptii aruncate de metoda run a unui t$read Se implementeaza interfata T$read),ncaug$tException<andler# creandu"se o clasa $andler de exceptie Pentru t$readul care ruleaza tas%ul# se asigneaza $andlerul de exceptie cu metoda set,ncaug$tException<andler 9ceasta operatie poate fi scrisa in medoa newT$read a unui T$read2actor-# si apoi se pot utiliza executorii Se poate asigna $andlerul de exceptii implicit a clasei T$read cu set(efault,ncaug$tException