Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

Documente similare
Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Ingineria Sistemelor de Programare

Laborator 3

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Ingineria Sistemelor de Programare

Microsoft Word - 2 ES RO.doc

Top

Curs 10

Microsoft Word _POO_Lab_1_Modificari_v01.htm

PROGRAMARE ORIENTATA PE OBIECTE

Laborator 10 - Paradigme de Programare Corutine - suport nativ pentru paralelism în Kotlin Înainte de a trece la realizarea unei aplicații utilizând c

Proiectarea Sistemelor Software Complexe

PPSD

Paradigme de Programare

Laborator Activities În sistemul Android activitățile reprezintă echivalentul ferestrelor din Windows, fiind clase care extind clasa Activity. Spre de

Microsoft Word - lab4.doc

CURS

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Programarea şi utilizarea calculatoarelor

Poo Laboratoare 1 Contents Laborator7 2 1 Colecţii de obiecte în Java Interfaţa Iterator Interfaţa C

Microsoft Word - CarteC.doc

SUBPROGRAME

9. Design patterns - Singleton, Factory, Observer Scopul acestui curs este familiarizarea cu folosirea unor pattern-uri des întâlnite în design-ul atâ

Paradigme de programare

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Procesarea de imagini folosind programarea paralela. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte l

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

E_d_Informatica_sp_MI_2015_bar_02_LRO

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Slide 1

Matrici și vectori în VBA În VBA, o matrice este un grup de variabile de același tip. De ce ar trebui să utilizați o matrice? Presupunem că ați vrut s

Caraivan George-Alexandru Grupa 431A Interfața driver-kernel la Linux Introducere Deși pentru unii dintre noi acest lucru poate fi o supriză, cei mai

LUCRAREA 8 PROGRAMAREA NELINIARĂ ÎN REZOLVAREA PROBLEMELOR DIN ENERGETICĂ. METODE DE ORDINUL Aspecte generale Programarea neliniară are o foart

Platformăde e-learning și curriculăe-content pentru învățământul superior tehnic Sisteme de operare 13. Planificarea proceselor

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Declararea variabilelor

ALGORITMICĂ. Seminar 3: Analiza eficienţei algoritmilor - estimarea timpului de execuţie şi notaţii asimptotice. Problema 1 (L) Să se determine număru

Programarea şi utilizarea calculatoarelor

Programarea şi utilizarea calculatoarelor

Microsoft PowerPoint - ARI_R_c9-10_IP_part2 [Compatibility Mode]

Lucrarea nr. 4 - Algoritmi de sortare şi ordonare Breviar teoretic Un algoritm de sortare este o metoda prin care se aranjează elementele unui tablou

Limbaje de Programare Curs 8 – Fisiere

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

Microsoft Word - CarteC.doc

Algoritmi genetici paraleli. Implementari Java. Continut laborator: 1. Obiectivul lucrarii. 2. Notiuni teoretice: 3. Cerinte laborator. 4. Tema. 1. Ob

Tablouri (continuare)

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

PowerPoint Presentation

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

tehnologii web

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Curs 6 Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate reut

Microsoft Word - 4-Interfete paralele.doc

proiectarea bazelor de date

Lab6LCD

Logică și structuri discrete Relații. Funcții parțiale Marius Minea marius/curs/lsd/ 20 octombrie 2014

Diapositive 1

PowerPoint Presentation

Facultatea de Științe Politice, Administrative și ale Comunicării Str. Traian Moșoiu nr. 71 Cluj-Napoca, RO Tel.: Fax:

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri

Analiză de flux de date 29 octombrie 2012

Universitatea Politehnica din București Facultatea de Electronică, Telecomunicații și Tehnologia Informației Metode de extindere a duratei de viaţă a

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

Slide 1

Slide 1

Microsoft Word - PCLP2_Curs_4_2019.doc

L7

Aggregating Data

Analiză statică Analiza fluxului de date 23 octombrie 2014

Microsoft Word - Curs 7 - JavaScript.doc

MergedFile

Modulul 1 M1-2.3 Protocoale şi servicii în reţea În acest capitol ne propunem să abordăm următoarele: Protocoalele şi aplicaţiile folosite în reţelele

Microsoft Word _SwRTc_Proiect_Faza1_v01.htm

Microsoft Word - Curs_09.doc

Object Oriented Programming

Microsoft Word - 2 Filtre neliniare.doc

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

U.T.Cluj-Napoca, C.U.N. Baia Mare Facultatea: Inginerie PLAN de INVĂŢĂMÂNT Domeniul: Calculatoare şi Tehnologia Informaţiei anul univ Progr

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

CASA CORPULUI DIDACTIC BRAILA PROGRAM DE FORMARE INFORMATICA SI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: TIMOFTI V. AFRODITA COLEGIUL

09. Informatica 2 - MM 1

Slide 1

Introducere în limbajul JavaScript

Microsoft Word - CarteC.doc

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Lucrarea 10

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Concepte de bază ale Tehnologiei Informației

Laborator Fragments Un fragment reprezintă o porțiune dintr-un Activity. Într-un activity se pot combina mai multe fragmente ți un fragment se poate r

..MINISTERUL EDUCAŢIEI NAȚIONALE ŞI CERCETARII STIINTIFICE UNIVERSITATEA DE VEST DIN TIMIȘOARA.I CENTRUL DE DEZVOLTARE ACADEMICĂ. FIŞA DISCIPLINEI (CO

Proceduri stocate Syntax: CREATE PROCEDURE <Name> type1,...] AS -- secventa de comenzi SQL GO O procedura stocata se ruleaza cu EXEC: EXEC <N

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Capitole Speciale de Informatică Curs 4: Calculul scorurilor în un sistem complet de extragere a informaţiilor 18 octombrie 2018 Reamintim că în cursu

CONFIGURARE SHOREWALL Autor:Marius Strâcnă Data: Versiunea: 1.1 Ce este Shorewall? Shorewall este un instrument free software firewall pent

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

2 BAZE TEORETICE ALE REȚELELOR DE CALCULATOARE CAPITOLUL 2 BAZE TEORETICE ALE REŢELELOR DE CALCULATOARE 2.1. Necesitatea standardizării (referenţierii

Ingineria Sistemelor de Programare

Ghid de referinţă rapidă pentru Seria ZT400™

Transcriere:

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

I. NOŢIUNI TEORETICE A. Ce este un fir de execuţie? Înainte de a defini conceptul de fir de execuţie sau thread, ne vom opri asupra conceptului de multitasking. Acesta se referă la capacitatea unui computer de a executa mai multe programe (task-uri, procese) în acelaşi timp. Având în vedere această noţiune, putem defini conceptul de multithreading care se referă la execuţia mai multor secvenţe de cod în acelaşi timp, în cadrul aceluiaşi program. O astfel de secvenţă de cod se numeşte fir de execuţie sau thread. Un thread se execută în contextul unui program şi nu poate fi tratat decât în cadrul unui program. Exemplele prezentate până acum au dispus de un sigur fir de execuţie, adică de o singură structură secvenţială de instrucţiuni. B. Lucrul cu fire de execuţie Limbajul Java pune la dispoziţia programatorului, in pachetul java.lang, două clase şi o interfaţă pentru lucrul cu thread-uri: clasa Thread: lucru cu thread-uri ca entităţi separate; clasa ThreadGroup: crearea unor grupuri de thread-uri în vederea tratării acestora în mod unitar; interfaţa Runnable: lucru cu thread-uri ca entităţi separate. 1. Crearea unui thread derivând clasa Thread Operaţiile următoare reprezintă numărul minim de paşi ce trebuie îndepliniţi pentru lucrul cu un thread creat prin moştenirea clasei Thread: 1. crearea unei clase obişnuite care moşteneşte clasa Thread. class MyThread extends Thread{ } 2

2. suprascrierea metodei public void run() a clasei Thread în clasa derivată, MyThread. Instrucţiunile din această metodă trebuie să implementeze ceea ce se doreşte ca thread-ul să facă. Aceasta poate apela alte metode, folosi alte clase şi declara variabile ca orice metodă.metoda run() este apelată atunci când se execută un thread. Pentru a înţelege mai bine se face o paralelă cu metoda main. Aceasta care este apelată atunci când se execută o aplicaţie Java. Mai mult, atunci când JVM este pornită, se porneşte o dată cu ea un thread care apelează metoda main. 3. instanţierea unui obiect thread prin intermediul operatorului new; MyThread obthread = new MyThread(); 4. pornirea thread-ului instanţiat prin apelul metodei start() moştenită din clasa Thread. obthread.start(); Urmăriţi un exemplu de lucru cu thread-uri prin derivarea clasei Thread în secţiunea II A. 2. Crearea unui thread implementând interfaţa Runnable Operaţiile care trebuie îndeplinite pentru a putea crea un thread prin implementarea interfeţei Runnable sunt următorele: 1. crearea unei clase care să implementeze interfaţa Runnable. class MyRunnable implements Runnable { } 2. clasa care implementează interfaţa Runnable trebuie să suprascrie toate metodele definite în aceasta, dar cum interfaţa conţine doar metoda run(), ea este singura metodă ce trebuie suprascrisă. Metoda run() implementează ceea ce se doreşte ca thread-ul să facă. 3. se instanţiază un obiect al clasei create utilizând operatorul new. MyRunnable myrunnableobj = new MyRunnable(); 4. se instanţiază un obiect al clasei Thread utilizând un constructor ce are ca şi parametru un obiect de tipul clasei care implementează interfaţa Runnable. Thread thread = new Thread(myRunnableObj); 3

5. se porneşte thread-ul. thread.start(); Pentru o mai bună înţelegere urmăriţi exemplul prezentat în secţiunea II B. 3. Clasa Thread vs interfaţa Runnable Clasa Thread defineşte o serie de metode ce pot fi suprascrise de clasa ce derivă din Thread. Singura care trebuie suprascrisă obligatoriu este run(). Însă, această condiţie se impune şi in cazul clasei care implementează interfaţa Runnable. Aşadar, dacă nu se doreşte suprascrierea altor metode din Thread, atunci este mai bine să folosim a doua metodă. Mai mult, cum în Java nu este permisă moştenirea multiplă, creare unui thread prin implementarea interfeţei Runnable devine un avantaj pentru că acel thread poate să moştenească funcţionalităţi definite în alte clase Java. C. Controlul unui fir de execuţie Un thread se poate afla la un moment dat într-una din stările următoare: nou creat, în execuţie, blocat, terminat. Clasa Thread conţine o serie de metode ce controlează execuţia unui thread. Iată câteva dintre cele mai importante: Nume metodă Descriere String getname() se obţine numele thread-ului int getpriority() se obţine prioritatea thread-ului boolean isalive() determină faptul că un thread mai este în execuţie sau nu void join() forţează un thread să aştepte terminarea altuia void run() entry point pentru un thread static void sleep(long millis) suspendă execuţia unui thread pentru millis milisecunde void start() începe execuţia unui fir printr-un apel run() void stop() opreşte execuţia unui thread Pentru mai multe informaţii despre metodele clasei Thread consultaţi API-ul clasei. 4

D. Priorităţi Aparent thread-urile se execută simultan, dar la un moment dat doar un singur thread are acces la resursele de sistem. Fiecare thread obţine o perioadă de timp în care are acces la resurse, accesul făcându-se în mod organizat de către un planificator. Una dintre regulile pe care se bazează planificatorul o reprezintă mecanismul de priorităţi. Având în vedere cele spuse mai sus, fiecărui thread i se asociază un nivel de prioritate (un număr întreg). Cu cât acest nivel este mai mare cu atât thread-ul va avea prioritate mai mare la resurse. Dacă totuşi mai multe thread-uri au acelaşi nivel de prioritate, mecanismul de priorităţi dă dreptul de execuţie fiecăruia printr-un algoritm circular. Lucrul cu priorităţi este exemplificat în secţiunea II D. E. Sincronizarea firelor de execuţie Există cazuri în care mai multe thread-uri accesează aceeaşi resursă aparent în acelaşi timp. Pentru a evita astfel de situaţii, care pot crea confuzie, limbajul Java oferă conceptul de monitor. Acest lucru se realizează prin declararea unor metode, blocuri de cod ale unui obiect synchronized. Modificatorul synchronized permite unui singur thread accesul, la un moment dat, la acele metode sau blocuri de cod ale obiectului. Aşadar, dacă un thread apeleză o metodă synchronized a unui obiect, un alt thread nu are acces la ea până când primul thread nu a terminat-o de executat. Exemplul este prezentat în secţiunea II E. II. PREZENTAREA LUCRĂRII DE LABORATOR A. Crearea unui thread derivând clasa Thread Exemplul este destul de simplu şi nu necesită explicaţii suplimentare o dată ce au fost urmăriţi paşii din secţiunea I B 1. 1 public c l a s s MyThread extends Thread{ 2 private int countdown = 1 0 ; 3 4 public void run ( ) { 5 System. out. p r i n t l n ( " \ t b e g i n run method... " ) ; 6 while ( countdown >=0){ 7 System. out. p r i n t l n ( " \ t \ t S t e p s l e t f t t o do : "+countdown ) ; 5

8 countdown ; 9 } 10 System. out. p r i n t l n ( " \ t end run method! " ) ; 11 } 12 } 1 public c l a s s DemoThread { 2 3 public s t a t i c void main ( String [ ] args ) { 4 System. out. p r i n t l n ( " b e g i n main... " ) ; 5 MyThread obthread = new MyThread ( ) ; 6 System. out. p r i n t l n ( " s t a r t the t h r e a d " ) ; 7 obthread. s t a r t ( ) ; 8 System. out. p r i n t l n ( " s t i l l i n main... " ) ; 9 } 10 11 } Un singur lucru pare să fie curios: apariţia mesajului still in main... imediat după mesajul start the thread. Acest lucru se întâmplă din cauza faptului că metoda main are propriul său fir de execuţie în care rulează. Prin apelul metodei start() a thread-ului se cere maşinii virtuale Java crearea şi pornirea unui nou thread. Din acest moment JVM preia controlul execuţiei programului creând contextul necesar unui thread şi în acest context se apelează metoda run(). Ca urmare se iese imediat din metoda start(). B. Crearea unui thread implementând interfaţa Runnable Exemplul prezentat mai jos este puţin mai complex în sensul că profităm de avantajele implementării unei interfeţe, putând totuşi moşteni orice altă clasă. 1 public c l a s s D i s p l a y { 2 public void printmessage ( String message ) { 3 System. out. p r i n t l n ( message ) ; 4 } 5 } Clasa MyRunnable moşteneşte clasa Display, dar beneficiază de proprietăţile unei clase de tip thread prin implementarea interfeţei Runnable. Unele dintre îmbunătăţirile ce sunt aduse programului sunt mutarea instanţierii thread-ului (se trimite ca parametru obiectul curent, deci un obiect de tipul MyRunnable) şi pornirea acestuia în constructorul clasei MyRunnable. 1 public c l a s s MyRunnable extends D i s p l a y implements Runnable { 2 private int countdown = 1 0 ; 3 private Thread thread ; 4 5 public MyRunnable ( ) { 6

6 t h r e a d = new Thread ( t h i s ) ; 7 System. out. p r i n t l n ( " s t a r t the t h r e a d " ) ; 8 t h r e a d. s t a r t ( ) ; 9 } 10 11 public void run ( ) { 12 p r i n t M e s s a g e ( " \ t b e g i n run method... " ) ; 13 while ( countdown >= 0) { 14 p r i n t M e s s a g e ( " \ t \ t S t e p s l e t f t to do : " + countdown ) ; 15 countdown ; 16 } 17 p r i n t M e s s a g e ( " \ t end run method! " ) ; 18 } 19 } Clasa DemoRunnable instanţiază un obiect de tipul MyRunnable. Astfel se apelează constructorul unde se creează şi se porneşte thread-ul. 1 public c l a s s DemoRunnable { 2 public s t a t i c void main ( String [ ] args ) { 3 System. out. p r i n t l n ( " b e g i n main... " ) ; 4 MyRunnable myrunnableobj = new MyRunnable ( ) ; 5 System. out. p r i n t l n ( " s t i l l i n main... " ) ; 6 } 7 } C. Controlul unui fir de execuţie Exemplul următor prezintă modul de utilizare al metodelor clasei Thread. Clasa MyThread moşteneşte clasa Thread şi creează un constructor cu un parametru ce apelează constructorul clasei de bază. Metoda run() este identică cu cea din exemplele anterioare. 1 public c l a s s MyThread extends Thread{ 2 private int countdown = 5 ; 3 4 public MyThread ( S t r i n g name ) { 5 super ( name ) ; 6 } 7 8 public void run ( ) { 9 System. out. p r i n t l n ( " \ t b e g i n run method... " ) ; 10 while ( countdown >=0){ 11 System. out. p r i n t l n ( " \ t \ t S t e p s l e t f t t o do : "+countdown ) ; 12 countdown ; 13 } 14 System. out. p r i n t l n ( " \ t end run method! " ) ; 15 } 16 } Clasa DemoThread creează două thread-uri. Pe primul îl porneşte şi îl suspendă pentru 4000 de milisecunde. Observaţi starea în care se află thread-ul după suspendarea temporară a acestuia 7

(apelul metodei isalive()). Apoi, se porneşte thread-ul al doilea şi se blochează resursele acestuia până când se reia execuţia lui (apelul metodei resume()). Observaţi starea thread-ului după apelul metodei suspend(). În cele din urmă, se forţează blocarea thread-ului principal până când mythread2 işi termină execuţia (linia de cod 29). 1 public c l a s s DemoThread { 2 public s t a t i c void main ( String [ ] args ) throws InterruptedException { 3 System. out. p r i n t l n ( " b e g i n main t h r e a d... " ) ; 4 MyThread mythread1 = new MyThread ( " t h r e a d 1 " ) ; 5 mythread1. s t a r t ( ) ; 6 System. out. p r i n t l n ( mythread1. getname ( ) ) ; 7 try { 8 mythread1. s l e e p ( 4 0 0 0 ) ; 9 } catch ( InterruptedException e ) { 10 e. p r i n t S t a c k T r a c e ( ) ; 11 } 12 i f ( mythread1. i s A l i v e ( ) ) { 13 System. out. p r i n t l n ( mythread1. getname ( )+" i s a l i v e! " ) ; 14 } e l s e { 15 System. out. p r i n t l n ( mythread1. getname ( )+" i s t e r m i n a t e d! " ) ; 16 } 17 18 MyThread mythread2 = new MyThread ( " t h r e a d 2 " ) ; 19 System. out. p r i n t l n ( mythread2. getname ( ) ) ; 20 mythread2. s t a r t ( ) ; 21 mythread1. suspend ( ) ; 22 i f ( mythread2. i s A l i v e ( ) ) { 23 System. out. p r i n t l n ( mythread2. getname ( )+" i s a l i v e! " ) ; 24 } e l s e { 25 System. out. p r i n t l n ( mythread2. getname ( )+" i s t e r m i n a t e d! " ) ; 26 } 27 28 System. out. p r i n t l n ( " b e f o r e main t h r e a d s l e e p s " ) ; 29 Thread. s l e e p ( 2 0 0 0 ) ; 30 System. out. p r i n t l n ( " a f t e r main t h r e a d has s l e p t " ) ; 31 32 mythread2. s l e e p ( 2 0 0 0 ) ; 33 mythread2. resume ( ) ; 34 try { 35 mythread2. j o i n ( ) ; 36 } catch ( InterruptedException e ) { 37 e. p r i n t S t a c k T r a c e ( ) ; 38 } 39 mythread2. s l e e p ( 1 0 0 0 ) ; 40 System. out. p r i n t l n ( " end main t h r e a d!!! " ) ; 41 } 42 } 8

D. Priorităţi Clasa PriorityThread implementează interfaţa Runnable şi are un constructor cu un parametru ce setează nivelul de prioritate al thread-ului şi care instanţiază un obiect de tip thread, prezent ca atribut al clasei. Metoda run() apelează metoda tostring() a clasei Thread cât timp atributul countdown este mai mare ca 0. 1 public c l a s s P r i o r i t y T h r e a d implements Runnable { 2 private int countdown = 5 ; 3 private int p r i o r i t y ; 4 public Thread thread ; 5 6 public P r i o r i t y T h r e a d ( int p r i o r i t y ) { 7 t h i s. p r i o r i t y = p r i o r i t y ; 8 t h r e a d = new Thread ( t h i s ) ; 9 } 10 11 public void run ( ) { 12 t h r e a d. s e t P r i o r i t y ( p r i o r i t y ) ; 13 System. out. p r i n t l n ( " \ t b e g i n run method... " ) ; 14 while ( countdown >=0){ 15 System. out. p r i n t l n ( t h r e a d. t o S t r i n g ( )+" countdown : "+countdown ) ; 16 countdown ; 17 } 18 System. out. p r i n t l n ( " \ t end run method! " ) ; 19 } 20 } Clasa DemoPriority creează două obiecte de tipul PriorityThread cu parametri declaraţi ca şi constante în clasa Thread. Se porneşte execuţia acestora şi thread-ul principal este obligat să aştepte terminarea execuţiei celor două thread-uri anterioare înainte de a deveni inactiv. Observaţi ordinea în care se pornesc thread-urile şi ordinea în care se execută. 1 public c l a s s DemoPriority { 2 public s t a t i c void main ( String [ ] args ) { 3 System. out. p r i n t l n ( " b e g i n main t h r e a d... " ) ; 4 P r i o r i t y T h r e a d threadmin = new P r i o r i t y T h r e a d ( Thread.MIN_PRIORITY) ; 5 P r i o r i t y T h r e a d threadmax = new P r i o r i t y T h r e a d ( Thread.MAX_PRIORITY) ; 6 threadmin. t h r e a d. s t a r t ( ) ; 7 threadmax. t h r e a d. s t a r t ( ) ; 8 try { 9 threadmax. t h r e a d. j o i n ( ) ; 10 threadmin. t h r e a d. j o i n ( ) ; 11 }catch ( InterruptedException e ) { 12 System. out. p r i n t l n ( " i n t e r r u p t e d e x c e p t i o n " ) ; 13 } 14 System. out. p r i n t l n ( " end main t h r e a d!!! " ) ; 15 } 16 } 9

E. Sincronizarea firelor de execuţie Clasa MySynchronized are un constructor cu doi parametri. Unul este de tip String şi reprezintă numele thread-ului, iar cel de-al doilea este un număr întreg. Constructorul este cel care instanţiază thread-ul şi tot el este cel care îl porneşte. Observaţi cele două metode care folosesc modificatorul synchronized. Prima metodă îl foloseşte ca modificator al funcţiei, iar ce-a de-a doua metodă, cea între comentarii, îl foloseşte ca şi bloc. Important de reţinut este că în varianta bloc synchronized se aplică doar pe obiecte. 1 public c l a s s MySynchronized implements Runnable { 2 private int count ; 3 private Thread thread ; 4 5 public MySynchronized ( String name, int count ) { 6 this. count = count ; 7 thread = new Thread ( this, name ) ; 8 t h r e a d. s t a r t ( ) ; 9 } 10 11 public synchronized int add ( ) { 12 count++; 13 try { 14 Thread. s l e e p ( 1 0 0 0 ) ; 15 }catch ( InterruptedException e ) { 16 System. out. p r i n t l n ( " main t h r e a d i n t e r r u p t e d " ) ; 17 } 18 ++count ; 19 return count ; 20 } 21 22 / p u b l i c i n t add ( ) { 23 s y n c h r o n i z e d ( t h r e a d ) { 24 count++; 25 try { 26 Thread. s l e e p ( 1 0 0 0 ) ; 27 } catch ( InterruptedException e ) { 28 System. out. p r i n t l n ( " main t h r e a d i n t e r r u p t e d " ) ; 29 } 30 ++count ; 31 retur n count ; 32 } 33 } / 34 35 public void run ( ) { 36 System. out. p r i n t l n ( t h r e a d. getname ( ) + " s t a r t i n g. " ) ; 37 System. out. p r i n t l n ( " \ t the numer o f "+t h r e a d. getname ( )+" i s : "+add ( ) ) ; 38 System. out. p r i n t l n ( t h r e a d. getname ( ) + " t e r m i n a t i n g. " ) ; 39 } 40 } Clasa DemoSynchronized creează două obiecte de tipul MySynchronized. 1 public c l a s s DemoSynchronized { 10

2 public s t a t i c void main ( String [ ] args ) { 3 System. out. p r i n t l n ( " b e g i n main t h r e a d... " ) ; 4 MySynchronized thread1 = new MySynchronized ( " thread1 ", 1 ) ; 5 MySynchronized thread2mysyncronized = new MySynchronized ( " thread2 ", 2 ) ; 6 System. out. p r i n t l n ( " b e g i n main t h r e a d... " ) ; 7 } 8 } III. TEMĂ 1. Realizaţi un program care creează cel puţin două fire de execuţie ce calculează produsul elementelor aceluiaşi vector. Elementele vectorului se vor citi din fişierul in.txt, iar rezultatul se va afişa într-un alt fişier, out.txt. Cerinţe de implementare: pentru calculul produsului folosiţi synchronized (ori modificatorul de acces ori ca bloc); pentru implementarea thread-urilor puteţi folosi oricare dintre cele două metode prezentate în laborator; atât pentru lucrul cu fişiere cât şi pentru lucrul cu thread-uri se vor folosi mecanisme de tratare a excepţiilor. 11