P. 1
Cristian Frasinaru-Curs Practic de Java

Cristian Frasinaru-Curs Practic de Java

|Views: 8|Likes:
Published by dany3220

More info:

Published by: dany3220 on Nov 13, 2010
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

09/23/2012

pdf

text

original

Obiectul de tip Buffer din exemplul anterior are o variabil˘a membr˘a privat˘a

numit˘a number, ˆın care este memorat num˘arul pe care ˆıl comunic˘a produ-

catorul ¸si pe care ˆıl preia consumatorul. De asemenea, mai are o variabil˘a

privat˘a logic˘a available care ne d˘a starea buffer-ului: dac˘a are valoarea true

ˆınseamn˘a c˘a produc˘atorul a pus o valoare ˆın buffer ¸si consumatorul nu a

preluat-o ˆınca; dac˘a este false, consumatorul a preluat valoarea din buffer

dar produc˘atorul nu a pus deocamdat˘a alta la loc. Deci, la prima vedere,

metodele clasei Buffer ar trebui s˘a arate astfel:

public synchronized int get() {

while (!available) {

// Nimic - asteptam ca variabila sa devina true

}

available = false;

return number;

}

public synchronized int put(int number) {

while (available) {

370

CAPITOLUL 12. FIRE DE EXECUT¸IE

// Nimic - asteptam ca variabila sa devina false

}

available = true;

this.number = number;

}

Varianta de mai sus, de¸si pare corect˘a, nu este. Aceasta deoarece im-

plementarea metodelor este ”selfish”, cele dou˘a metode ˆısi asteapt˘a ˆın mod

egoist condit¸ia de terminare. Ca urmare, corectitudinea funct¸ion˘arii va de-

pinde de sistemul de operare pe care programul este rulat, ceea ce reprezint˘a

o gre¸seal˘a de programare.

Punerea corect˘a a unui fir de execut¸ieˆın asteptare se realizeaz˘a cu metoda

wait a clasei Thread, care are urm˘atoarele forme:

void wait( )

void wait( long timeout )

void wait( long timeout, long nanos )

Dup˘a apelul metodei wait, firul de execut¸ie curent elibereaz˘a monitorul

asociat obiectului respectiv ¸si a¸steapt˘a ca una din urm˘atoarele condit¸ii s˘a fie

ˆındeplinit˘a:

• Un alt fir de execut¸ie informeaz˘a pe cei care ”a¸steapt˘a” la un anumit
monitor s˘a se ”trezeasc˘a” - acest lucru se realizeaz˘a printr-un apel al

metodei notifyAll sau notify.

• Perioada de a¸stepatare specificat˘a a expirat.

Metoda wait poate produce except¸ii de tipul InterruptedException,

atunci cˆand firul de execut¸ie care a¸steapt˘a (este deciˆın starea ”Not Runnable”)

esteˆıntrerupt din a¸steptare¸si trecut fort¸atˆın starea ”Runnable”, de¸si condit¸ia

a¸steptat˘a nu era ˆınc˘a ˆındeplinit˘a.

Metoda notifyAll informeaz˘a toate firele de execut¸ie care suntˆın asteptare

la monitorul obiectului curentˆındeplinirea condit¸iei pe care o a¸steptau. Metoda

notify informeaz˘a doar un singur fir de execut¸ie, specificat ca argument.

Reamintim varianta corect˘a a clasei Buffer:

Listing 12.9: Folosirea semafoarelor

class Buffer {
private int number = -1;

12.3. CICLUL DE VIAT¸ ˘

A AL UNUI FIR DE EXECUT¸IE

371

private boolean available = false;

public synchronized int get() {
while (!available) {
try {

wait();

// Asteapta producatorul sa puna o valoare

} catch (InterruptedException e) {
e.printStackTrace();

}

}
available = false;
notifyAll();
return number;

}

public synchronized void put(int number) {
while (available) {
try {

wait();

// Asteapta consumatorul sa preia valoarea

} catch (InterruptedException e) {
e.printStackTrace();

}

}
this.number = number;
available = true;
notifyAll();

}

}

You're Reading a Free Preview

Download
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->