QReferate - referate pentru educatia ta.
Cercetarile noastre - sursa ta de inspiratie! Te ajutam gratuit, documente cu imagini si grafice. Fiecare document sau comentariu il poti downloada rapid si il poti folosi pentru temele tale de acasa.



AdministratieAlimentatieArta culturaAsistenta socialaAstronomie
BiologieChimieComunicareConstructiiCosmetica
DesenDiverseDreptEconomieEngleza
FilozofieFizicaFrancezaGeografieGermana
InformaticaIstorieLatinaManagementMarketing
MatematicaMecanicaMedicinaPedagogiePsihologie
RomanaStiinte politiceTransporturiTurism
Esti aici: Qreferat » Documente informatica

Procese si fire de executie (thread-uri)



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 :

  • specificarea unui protocol in termeni de signaturi de metode abstracte (fara corp);
  • o interfata nu contine cod;
  • o interfata nu poate avea variabile membru dar poate avea constante de clasa (variabile statice si finale) ;
  • o clasa care implementeaza o interfata trebuie sa precizeze corpul tuturor metodelor din interfata.

Exemplu: Clasa ColoredPoint este o subclasa a lui Points2D, si implementeaza  interfata Colorable. Prin urmare, clasa ColoredPoint trebuie sa implementeze metoda setColor.


public interface Colorable // end Colorable

class Point2D // end Point2D

class ColoredPoint extends Point2D implements Colorable
}// end ColoredPoint

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.


class MyThread extends Thread

public void run()

O instanta a lui Thread se lanseaza apeland metoda start():


MyThread p = new MyThread();
p.start(

Apelul metodei start() trece thread-ul in starea "ready", fapt care ii permite excecutia imediat ce este posibil. Masina virtuala Java este cea care decide momentul la care thread-ul va fi executat. In momentul in care se executa thread-ul, este apelata metoda sa run().

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.


class MyThread2 implements Runnable

public void run()


Pentru crearea si lansarea unui thread, se procedeaza astfel :

MyThread2 p = new MyThread2();
Thread T = Thread(p);
T.start(

Exercitiu:
a) Care dintre cele doua metode este mai avantajoasa?
b) Rezolvati problema anterioara prin metoda 2.

4. Metodele clasei Thread


Principalele functionalitati ale clasei Thread sunt oferite prin intermediul metodelor urmatoare :

  • sleep( long ms ) : thread-ul care apeleaza aceasta metoda este blocat ms milisecunde (in acest timp, se pot executa alte thread-uri).
  • isAlive( : returneaza true daca thread-ul asupra caruia se aplica metoda a fost demarat cu ajutorul lui start() dar metoda sa run() nu a fost inca terminata. Un thread "viu" poate fi in oricare din cele trei stari.
  • getPriority( si setPriority( int prioritate ) permit gestionarea prioritatii thread-ului.

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 :


public class ShareExample extends Thread


public void run()


public static void main(String args[])



Cate thread-uri sunt create in acest program?
Ce se poate obtine in urma executiei acestui program?


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.


Nu se poate descarca referatul
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 }