Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
Procese si fire de executie (thread-uri)
I. Procese
In general, un proces este un program in curs de executie.
Sistemul aloca memorie fiecarui proces:
segment de cod (instructiuni)
segment de date (alocare dinamica)
segment de stiva (variabile locale si adrese de intoarcere ale functiilor)
Fiecare proces dispune de o multime de registri ai procesorului.
Sistemul asociaza fiecarui proces din multime informatii de gestiune: identificator (PID sub UNIX), descriptori (fisiere deschise, conexiuni in retea), prioritati, drepturi de acces etc.
Un proces se poate afla in diferite stari:
in executie (running): procesul se executa pe un procesor al sistemului
ready: procesul este pregatit pentru executie, dar nu dispune de un procesor
blocat: lipseste o resursa pentru a putea fi executat
Procesele sunt in excluziune mutuala daca utilizeaza o aceeasi resursa (numita resursa critica). Sectiunea critica a unui program este secventa de instructiuni pe perioada careia este utilizata resursa critica.
II.Thread-uri
1. Introducere
Un thread poate fi gandit ca un proces in interiorul unui proces.
Resursele alocate procesului vor fi partajate intre thread-urile care il compun. Un proces poseda minim un thread (cel care executa programul principal, de obicei, functia main()).
In Java, thread-urile pot fi gestionate cu ajutorul clasei Thread.
2. Notiunea de interfata in Java (recapitulare)
Programarea thread-urilor face apel la notiunea de interfata.
O interfata permite stabilirea unui ansamblu de comportamente abstracte, care definesc "contractul" pe care il va respecta o clasa :
Exemplu: Clasa ColoredPoint este o subclasa a lui Points2D, si implementeaza interfata Colorable. Prin urmare, clasa ColoredPoint trebuie sa implementeze metoda setColor.
Exercitiu:
Creati o interfata denumita Patrulater care specifica metodele suprafata() si perimetru(). Implementati interfata intr-o clasa abstracta denumita Paralelogram, care implementeaza doar metoda perimetru(). Clasa va fi apoi extinsa in clasele Dreptunghi si Romb.
3. Crearea si lansarea unui thread in Java
Metoda 1:
Prima metoda pentru crearea unui thread consta in definirea unei clase care mosteneste clasa Thread. Aceasta clasa trebuie sa supraincarce metoda run() a clasei Thread.
O instanta a lui Thread se lanseaza apeland metoda start():
Un thread se termina atunci cand se termina metoda sa run().
Exercitiu: Sa se creeze un thread care afiseaza numerele naturale, in ordine crescatoare, la interval de 2 secunde. Afisarea se va incheia la introducerea caracterului <enter>.
Metoda 2:
A doua metoda de creare a unui thread se realizeaza prin declararea unei clase care implementeaza interfata Runnable. Aceasta interfata declara o singura metoda: run().
Clasa Thread are un constructor care primeste ca argument o instanta care implementeaza Runnable.
Clasa se declara ca in exemplul precedent, cu diferenta ca se implementeaza interfata Runnable in loc de a se mosteni clasa Thread.
4. Metodele clasei Thread
Principalele functionalitati ale clasei Thread sunt oferite prin intermediul metodelor urmatoare :
Exercitiu: Sa se afiseze elementele unui vector de siruri de caractere unul cate unul, la interval de 5 secunde.
Obs Metoda sleep() este statica.
5. Partajarea memoriei intre thread-uri
Thread-urile asociate unui proces partajeaza acelasi spatiu de memorie.
Fiecare instanta a clasei Thread poseda propriile sale variabile (atribute). Pentru partajarea unei variabile intre mai multe thread-uri, se poate recurge la o variabila de clasa (prin definitie partajata intre toate instantele clasei), ca in exemplul urmator :
III. Un prim mod de sincronizare
Nu este de dorit ca rezultatul unui program sa nu poata fi predictibil, deci apare necesitatea unui mecanism care sa permita sincronizarea prelucrarilor facute de catre thread-uri.
Prin natura unor probleme, este necesar ca activitatea unui fir sa poata astepta terminarea firelor pe care le-a lansat inainte de a intreprinde alte activitati.
Metoda join() a clasei Thread permite ca un thread sa astepte pana cand un alt thread este terminat. Metoda are doua forme, dupa cum asteptarea este limitata sau nu la un anumit numar de secunde:
public final void join() throws InterruptedException
public final void join(long mili) throws InterruptedException
Exemplu: T1.join() determina asteptarea sfarsitului lui T1.
Exercitiu : Executati si comentati programul urmator:
class Tip extends Thread
}
class Test2
}
Exercitiu : (O problema de acces concurent)
Ce afiseaza programul urmator si de ce ? Cuma r trebui modificata sincronizarea astfel incat sa fie afisata valoarea 2 ?
public class ConcurrentExample extends Thread
catch (InterruptedException e)
tmp = tmp + 1;
cont = tmp;
}
public static void main(String args[]) throws InterruptedException
Cele doua thread-uri T1 si T2, care acceseaza o aceeasi variabila partajata (cont), lucreaza pe o copie locala tmp care este incrementata inainte de a fi rescrisa in cont. A fost intercalat un appel la sleep pentru simularea unei prelucrari mai indelungate si cresterea probabilitatii ca sistemul sa treaca de la un task la altul in timpul executiei lui run.
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre: |
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |