SwRTc – Laborator

 

Fire de executie (threads) Java

 

1. Introducere in fire de executie

 

Programele de calcul simple sunt secventiale, fiecare avand un inceput, o secventa de executii si un sfarsit. In orice moment pe durata executiei unui astfel de program exista un singur punct de executie.

 

Un fir de executie (thread), sau mai simplu, un fir, este similar acestor programe secventiale, in sensul ca are un inceput, o secventa de executii si un sfarsit, si in orice moment pe durata executiei firului exista un singur punct de executie. Totusi, un fir nu este el insusi un program, deoarece nu poate fi executat de sine statator. In schimb, firul este executat (ruleaza) intr-un program. Relatia dintre un program si un fir de executie este ilustrata mai jos.

 

 

Un fir de executie (thread) poate fi definit ca un flux de control secvential in cadrul unui program. Posibilitatea utilizarii mai multor fire de executie intr-un singur program, ruland (fiind executate) in acelasi timp si realizand diferite sarcini (nu in mod necesar diferite), este numita multithreading. Un navigator (browser) Web este un exemplu de aplicatie multi-filara (multithreaded). In browser se poate parcurge pagina in timpul descarcarii unei miniaplicatii Java (applet) a unei imagini, etc.

 

 

O denumire alternativa a firelor de executie este de lightweight process, deoarece un fir este similar unui proces real in sensul ca ambele sunt fluxuri de control secventiale. Totusi, un fir este considerat lightweight deoarece el ruleaza in contextul unui program si are la dispozitie reursele alocate pentru acel program si mediul programului.

 

Ca flux de control secvential, un fir de executie utilizeaza o parte din resursele programului in care ruleaza. De exemplu, el trebuie sa aiba propria stiva de executie si propriul contor de program. Codul firului de executie lucreaza doar in acel context. De aceea, o denumire alternativa este aceea de context de executie.

 

Masina virtuala Java, JVM (Java Virtual Machine), permite aplicatiilor sa aiba mai multe fire de executie care ruleaza in mod concurent (in paralel).

 

Fiecare fir de executie are un anumit nivel de prioritate. Firele cu nivel de prioritate mai mare sunt executate inaintea celor cu nivel de prioritate mai mic. Atunci cand codul care ruleaza intr-un fir de executie creaza un nou obiect de tip Thread, noul fir de executie are initial acelasi nivel de prioritate cu firul de executie care l-a creat.

 

Fiecare fir de executie are un nume, cu scopul identificarii lui. Daca nu este specificat un nume in momentul constructiei (initializarii) firului, un nou nume (aleator stabilit) este generat.

 

2. Clasa Thread – interfata publica

 

1. Principalii constructori ai clasei Thread:

 

Thread()
          Initializeaza un nou obiect de tip
Thread (care trebuie sa implementeze metoda run())

Thread(Runnable target)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un obiect tinta target (care trebuie sa implementeze metoda run()) dintr-o clasa care implementeaza interfata Runnable.

Thread(Runnable target, String name)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un obiect tinta target dintr-o clasa care implementeaza interfata Runnable, si un nume name.

Thread(String name)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un nume name.

Thread(ThreadGroup group, Runnable target)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un obiect tinta target dintr-o clasa care implementeaza interfata Runnable, grupul de fire de care apartine group.

Thread(ThreadGroup group, Runnable target, String name)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un obiect tinta target dintr-o clasa care implementeaza interfata Runnable, grupul de fire de care apartine group, si un nume.

Thread(ThreadGroup group, Runnable target, String name, long stackSize)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica un obiect tinta dintr-o clasa care implementeaza interfata Runnable, grupul de fire de care apartine, un nume, si dimensiunea stivei care ii va fi alocata pentru executie (stack size).

Thread(ThreadGroup group, String name)
          Initializeaza un nou obiect de tip
Thread caruia i se specifica grupul de fire de care apartine group, si un nume name.

 

 

2. Declaratiile si descrierea catorva metode ale clasei Thread:

 

 int

activeCount()
          Returneaza numarul firelor de executie active din grupul curent de fire.

 void

checkAccess()
          Determina daca firul curent executat are permisiunea de a modifica firul de executie curent (
this).

static Thread

currentThread()
          Returneaza o referinta catre obiectul
Thread curent executat.

 void

destroy()
          Distruge firul de executie curent (
this), fara eliberarea resurselor.

static void

dumpStack()
          Afiseaza informatiile din stiva ale firului de executie curent.

static int

enumerate(Thread[] tarray)
          Copiaza in tabloul specificat ca parametru referinte catre toate firele de executie active din grupul de fire curent si din subgrupurile sale.

 ClassLoader

getContextClassLoader()
          Returneaza obiectul context al firului de executie curent.

 String

getName()
          Returneaza numele firului de executie curent.

 int

getPriority()
          Returneaza nivelul de prioritate al firului de executie curent.

 ThreadGroup

getThreadGroup()
          Returneaza grupul de fire caruia ii apartine firul de executie curent.

static boolean

holdsLock(Object obj)
          Returneaza
true daca firul de executie curent detine lock-ul monitorului creat pe obiectul specificat ca parametru.

 void

interrupt()
          Intrerupe firul de executie curent.

static boolean

interrupted()
          Verifica daca firul de executie curent executat a fost intrerupt.

 boolean

isAlive()
          Verifica daca firul de executie curent este in viata.

 boolean

isDaemon()
          Verifica daca firul de executie curent este fir daemon.

 boolean

isInterrupted()
          Verifica daca firul de executie curent a fost intrerupt.

 void

join()
          Asteapta pana cand firul de executie curent moare.

 void

join(long millis)
          Asteapta cel putin valoarea specificata ca parametru, in milisecunde, pana cand firul de executie curent moare.

 void

join(long millis, int nanos)
          Asteapta cel putin
millis milisecunde plus nanos nanosecunde pana cand firul de executie curent moare.

 void

run()
          Implicit metoda nu executa nimic si returneaza.

 void

setContextClassLoader(ClassLoader cl)
          Stabileste obiectul context al firului de executie curent.

 void

setDaemon(boolean on)
          Marcheaza firul de executie curent ca fir daemon.

 void

setName(String name)
          Schimba numele firului de executie curent cu cel specificat ca parametru.

 void

setPriority(int newPriority)
          Stabileste nivelul de prioritate al firului de executie curent.

static void

sleep(long millis)
          Forteaza firul de executie curent executat sa cedeze temporar executia, pentru numarul de milisecunde specificat.

static void

sleep(long millis, int nanos)
          Forteaza firul de executie curent executat sa cedeze temporar executia, pentru numarul de milisecunde plus numarul de nanosecunde specificat.

 

 void

start()
          Forteaza firul de executie curent sa isi inceapa executia. Masina virtuala Java apeleaza metoda
run() a firului de executie curent.

 void

stop()
          
Deprecated. Metoda este in mod inerent nesigura. In majoritatea cazurilor utilizarea stop() poate fi inlocuita cu un cod care modifica o anumita variabila care indica faptul ca firul de executie tinta trebuie sa isi incheie executia, firul de executie tinta urmand sa verifice variabila in mod regulat si sa returneze din metoda sa run() atunci cand variabila indica necesitatea de a se incheia executia. Daca firul de executie tinta asteapta pentru perioade lungi de timp, atunci trebuie utilizata metoda interrupt() pentru a intrerupe asteptarea.

 void

stop(Throwable obj)
          Deprecated. Vezi explicatia de mai sus

 String

toString()
          Returneaza o reprezentare ca sir de caractere a firului de executie curent, incluzand numele, prioritatea, si grupul de fire ale firului de executie curent.

static void

yield()
          Forteaza firul de executie curent executat sa se opreasca temporar si sa permita altui fir de executie sa fie executat.