Programación Concurrente en Java

Texto completo

(1)

Programaci´

on Concurrente en Java

Hebras y monitores

Luis Fernando Llana D´ıaz

Departamento de Sistemas Inform´

aticos y Programaci´

on

Universidad Complutense de Madrid

(2)

Threads

Extendiendo la clase

java

.

lang

.

Thread

.

28 public class P r T h r e a d e x t e n d s Thread{

29 public P r T h r e a d(String s) { 30 super (s); 31 } 32 public final void run() {

33 b o o l e a n sigue= true ;

34 for ( int i=0; i<100 && sigue; i++) {

35 try { 36 System.out.p r i n t l n(g e t N a m e()+ " : " +i); 37 sleep(20); 38 } catch (I n t e r r u p t e d E x c e p t i o n e) { 39 System.out.p r i n t l n(g e t N a m e()+ " i n t e r r u m p i d a " ); 40 sigue= false ; 41 } 42 } 43 } 44 public static final void main( final String[] args){

45

Thread p = new P r T h r e a d( " mia " );

46

p.start();

47 }

(3)

Threads

Implementado el interfaz

java

.

lang

.

Runnable

.

26 public class P r R u n n a b l e i m p l e m e n t s R u n n a b l e {

27 public final void run() {

28

Thread hebra = Thread.c u r r e n t T h r e a d();

29 b o o l e a n sigue= true ;

30 for ( int i=0; i<100 && sigue; i++) {

31 try {

32

System.out.p r i n t l n(hebra.g e t N a m e()+ " : " +i);

33

hebra.sleep(20);

34 } catch (I n t e r r u p t e d E x c e p t i o n e) {

35

System.out.p r i n t l n(hebra.g e t N a m e()+ " i n t e r r u m p i d a " );

36 sigue= false ; 37 } 38 } 39 } 40 public static final void main( final String[] args) {

41

Thread p = new Thread( new P r R u n n a b l e() , " mia " );

42 p.start(); 43 } 44 }

(4)

Ciclo de vida de una hebra

Tras crear una hebra y se ejecuta el m´etodo

start

, la hebra puede

(5)

Parar una hebra

Usar el m´etodo

interrupt

1 public static void ex1() throws I n t e r r u p t e d E x c e p t i o n{

2 Thread h = new P r T h r e a d( " 1 " ); 3 h.start(); 4 Thread.sleep(100); 5 h.i n t e r r u p t(); 6 System.out.p r i n t l n(h.i s I n t e r r u p t e d()); 7 }

M´etodos

Deprecated

:

stop

,

suspend

,

resume

.

Una hebra para cunado est´a

Not Runnnable

, ha ejecutado

sleep

,

join

,

wait

.

Pueden lanzar

InterruptedException

, la hebra decide si para o

(6)

Esperamos a que una hebra acabe

M´etodo:

join

1 public static void ex2() throws I n t e r r u p t e d E x c e p t i o n {

2 Thread h1 = new P r T h r e a d( " 1 " ); 3 Thread h2 = new P r T h r e a d( " 2 " ); 4 Thread h3 = new P r T h r e a d( " 3 " ); 5 h1.start(); 6 h2.start(); 7 h3.start(); 8 h1.join(); 9 h2.join(); 10 h3.join(); 11 }

(7)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join() h3.join()

(8)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join()

1

h1

.

start

():

h1

se ejecuta.

(9)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join() h3.join()

1

h1

.

start

():

h1

se ejecuta.

2

h2

.

start

():

h2

se ejecuta.

(10)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join()

1

h1

.

start

():

h1

se ejecuta.

2

h2

.

start

():

h2

se ejecuta.

3

h3

.

start

():

h3

se ejecuta.

(11)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join() h3.join()

1

h1

.

start

():

h1

se ejecuta.

2

h2

.

start

():

h2

se ejecuta.

3

h3

.

start

():

h3

se ejecuta.

4

h1

.

join

(): esperamos a que

h1

(12)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join()

1

h1

.

start

():

h1

se ejecuta.

2

h2

.

start

():

h2

se ejecuta.

3

h3

.

start

():

h3

se ejecuta.

4

h1

.

join

(): esperamos a que

h1

pare.

5

h2

.

join

(): esperamos a que

h2

(13)

Esperamos a que una hebra acabe

M´etodo:

join

h3.start() h1.start() h2.start() h1.join() h2.join() h3.join()

1

h1

.

start

():

h1

se ejecuta.

2

h2

.

start

():

h2

se ejecuta.

3

h3

.

start

():

h3

se ejecuta.

4

h1

.

join

(): esperamos a que

h1

pare.

5

h2

.

join

(): esperamos a que

h2

pare.

6

h3

.

join

(): esperamos a que

h3

(14)

Cerrojos de objetos

Cada objeto en Java tiene un cerrojo

1 s y n c h r o n i z e d (obj) { 2 /* */ 3 }

El cerrojo puede abarcar a todo un m´etodo

1 type method (...) { 2 s y n c h r o n i z e d ( this ) { 3 /* */ 4 } 1 s y n c h r o n i z e d type method (...) { 2 /* */ 3 }

(15)

Variables condici´

on

(16)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

(17)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

(18)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

(19)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

¿Qu´e falta para tener un monitor?

las variables condici´on.

Todos los objetos tienen los m´etodos

wait

(),

notify

()

y

(20)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

¿Qu´e falta para tener un monitor?

las variables condici´on.

Todos los objetos tienen los m´etodos

wait

(),

notify

()

y

notifyAll

().

Un objeto con todos los m´etodos synchronized es un

(21)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

¿Qu´e falta para tener un monitor?

las variables condici´on.

Todos los objetos tienen los m´etodos

wait

(),

notify

()

y

notifyAll

().

Un objeto con todos los m´etodos synchronized es un

monitor con una sola variable condici´

on.

(22)

Variables condici´

on

¿Qu´e ocurre si todos los m´etodos son synchronized?

olo se

puede ejecutar un m´etodo a la vez

¿Qu´e falta para tener un monitor?

las variables condici´on.

Todos los objetos tienen los m´etodos

wait

(),

notify

()

y

notifyAll

().

Un objeto con todos los m´etodos synchronized es un

monitor con una sola variable condici´

on.

¿Qu´e hacemos si hay varias variables condici´on? Todo monitor

se puede hacer con una ´

unica variable condici´on, con p´erdida

(23)

Monitor puente

Tiene dos variables condici´on:

norte

y

sur

.

1 p r o c e d u r e p e r m i s o(s e n t i d o s) { 2 if (s.equals(S e n t i d o.sur)) { 3 espS++; 4 while ( numN > 0 || cupS>=m a x C u p o ) {

5

wait(sur);

6 }

7

espS- -; numS++; cupN=0;

8 if (espN>0) { 9 cupS++; 10 } 11 } else { // el s e n t i d o n o r t e 12 [[s i m i l a r]] 13 } 14 } 15 p r o c e d u r e f i n P e r m i s o(s e n t i d o s) { 16 if (s.equals(S e n t i d o.sur)) { 17 numS- -; 18 singal(norte); 19 } else { // s e n t i d o n o r t e 20 [[s i m i l a r....]] 21 } 22 }

(24)

Puente, versi´

on Java

acil

1 p r i v a t e int espN = 0 , espS = 0;

2 p r i v a t e int numN = 0 , numS = 0;

3 p r i v a t e int cupN = 0 , cupS = 0;

4 5 p r i v a t e int m a x C u p o;

6 7 public s y n c h r o n i z e d void p e r m i s o(S e n t i d o s) throws I n t e r r u p t e d E x c e p t i o n{

8 if ( s.equals(S e n t i d o.sur) ) {

9

espS ++;

10 while ( numN > 0 || cupS >=m a x C u p o ) { wait(); }

11 espS - -; numS++; 12 if ( espN>0 ) { cupS++; } 13 cupN=0; 14 } else { 15 /* s e n t i d o Norte , c o m p l e m e n t a r i o al a n t e r i o r */ 16 } 17 } 18 public s y n c h r o n i z e d void f i n P e r m i s o(S e n t i d o s) { 19 if ( s.equals(S e n t i d o.sur) ) { numS- -; }

20 else { numN- -; }

21

(25)

Implementaci´

on de monitores

1

a

idea: cada objeto es un sem´aforo

1

Object norte, sur;

2 public s y n c h r o n i z e d void p e r m i s o(S e n t i d o s) { 3 if ( s.equals(S e n t i d o.sur) ) { 4 espS ++; 5 while ( numN>0 || cupS>=m a x C u p o ) {

6 sur.wait(); 7 } 8 /* ... */ 9 } else { 10 espN ++; 11 while ( numS>0 || cupN>=m a x C u p o ) {

12 norte.wait(); 13 } 14 /* ... */ 15 } 16 }

Si el proceso se queda esperando en

sur

.

wait

(), no libera el

(26)

Implementaci´

on de monitores

(27)

Implementaci´

on de monitores

1

Cada objeto es un sem´aforo.

(28)

Implementaci´

on de monitores

1

Cada objeto es un sem´aforo.

2

Por cada variable condici´on es necesario un objeto sem´aforo.

(29)

Implementaci´

on de monitores

1

Cada objeto es un sem´aforo.

2

Por cada variable condici´on es necesario un objeto sem´aforo.

3

Antes de esperar en un

wait

hemos de abandonar el monitor.

(30)

Sem´

aforos

1 public final class S e m a f o r o {

2

String nombre;

3 int s;

4 public S e m a f o r o( int inicial, String _ n o m b r e) {

5 s=i n i c i a l; 6 nombre=_ n o m b r e; 7 } // S e m a f o r o c o n s t r u c t o r 8 public s y n c h r o n i z e d void P() throws I n t e r r u p t e d E x c e p t i o n {

9 while (s==0) { wait(); } 10 s- -; 11 } 12 public s y n c h r o n i z e d void V() { 13 s++; 14 notify(); 15 } 16 }

(31)

Variables Condici´

on I

1

Una variable condici´on b´asicamente es un sem´aforo.

2

Necesitamos tambi´en el sem´aforo del monitor para poder salir

antes de un

wait

y entr´ar despu´es.

1

S e m a f o r o mutex;

2 public final void Wait() throws I n t e r r u p t e d E x c e p t i o n {

3 mutex.V(); 4 n u m E s p e r a++; 5 s.P(); 6 mutex.P(); 7 }

(32)

Variables Condici´

on II

1 public class V a r i a b l e C o n d i c i o n { 2 int n u m E s p e r a; 3 S e m a f o r o s; 4 S e m a f o r o mutex; 5 public V a r i a b l e C o n d i c i o n(S e m a f o r o _mutex, String nombre) {

6 s = new S e m a f o r o(0 ,nombre); 7 n u m E s p e r a = 0; 8 mutex = _mutex; 9 } 10 public s y n c h r o n i z e d final void Signal() {

11 if (numEspera>0) { 12 numEspera- -; 13 s.V(); 14 } 15 } 16 }

(33)

Puente I

1 public class Puente {

2

V a r i a b l e C o n d i c i o n norte,sur;

3

S e m a f o r o mutex;

4 p r i v a t e int espN = 0 , espS = 0;

5 p r i v a t e int numN = 0 , numS = 0;

6 p r i v a t e int cupN = 0 , cupS = 0;

7 p r i v a t e int m a x C u p o; 8 9 public void p e r m i s o(S e n t i d o s) { 10 mutex.P(); 11 if ( s.equals(S e n t i d o.sur) ) { 12 espS ++; 13 while ( numN > 0 || cupS >=m a x C u p o ) { sur.Wait(); }

14 espS - -; numS++; 15 if ( espN>0 ) { cupS++; } 16 cupN=0; 17 } else { 18 /* s e n t i d o Norte , caso s i m e t r i c o al a n t e r i o r */ 19 } 20 mutex.V(); 21 }

(34)

Puente II

1 public void f i n P e r m i s o(S e n t i d o s) { 2 mutex.P(); 3 if ( s.equals(S e n t i d o.sur) ) { 4 numS- -; 5 if (numS==0) {norte.Signal();};

6 } else {

7

numN- -;

8 if (numN==0) {sur.Signal();};

9 } 10 mutex.V(); 11 } 12 public Puente( int cupo) {

13

m a x C u p o = cupo;

14

mutex = new S e m a f o r o(1 , " mutex " );

15

norte = new V a r i a b l e C o n d i c i o n(mutex, " norte " );

16

sur = new V a r i a b l e C o n d i c i o n(mutex, " norte " );

17 }

18 }

(35)

Puente III

1 p a c k a g e s i m u l a c i o n.puente;

2 public class Coche e x t e n d s Thread {

3 p r i v a t e S e n t i d o s e n t i d o; 4 p r i v a t e int id, t E n P u e n t e; 5 p r i v a t e long h o r a I n i c i o; 6 p r i v a t e Puente puente; 7 public Coche ( int i, S e n t i d o s, int t, Puente p){

8

s e n t i d o = s; id = i; t E n P u e n t e = t; puente = p;

9 }

10 public void run() {

11

System.out.p r i n t l n( " El coche " +id+ " quiere pasar en s e n t i d o " +

12

s e n t i d o + " : " + S i m u l a P u e n t e.t i e m p o S i m u l a c i o n());

13

puente.p e r m i s o(s e n t i d o);

14

System.out.p r i n t l n( " El coche " +id+ " ´aest p a s a n d o en s e n t i d o " +

15 s e n t i d o + " : " + S i m u l a P u e n t e.t i e m p o S i m u l a c i o n()); 16 try { 17 this .sleep(t E n P u e n t e* 1 0 0 0 ) ; 18 } catch ( I n t e r r u p t e d E x c e p t i o n e ) {} 19 puente.f i n P e r m i s o(s e n t i d o); 20

System.out.p r i n t l n( " El coche " +id+ " ha pasado en s e n t i d o " +

21 s e n t i d o + " : " + S i m u l a P u e n t e.t i e m p o S i m u l a c i o n()); 22 } 23 }

(36)

Puente IV

1 public S i m u l a P u e n t e( double tLlegadaN, double tLlegadaS, int tPuente, int tMax) { 2

Puente puente = new Puente(5);

3 G e n e r a d o r C o c h e s g e n e r a N o r t e = new G e n e r a d o r C o c h e s(S e n t i d o.norte, 4 tLlegadaN, 5 tPuente, tMax, 6 3333 , 7 puente); 8 G e n e r a d o r C o c h e s g e n e r a S u r = new G e n e r a d o r C o c h e s(S e n t i d o.sur, 9 tLlegadaS, 10 tPuente, tMax, 11 1111 , 12 puente); 13 g e n e r a N o r t e.start(); 14 g e n e r a S u r.start(); 15 h o r a I n i c i o = System.c u r r e n t T i m e M i l l i s(); 16 try { 17 g e n e r a N o r t e.join(); 18 g e n e r a S u r.join(); 19 } catch ( I n t e r r u p t e d E x c e p t i o n e ) { 20 } // end of try - c a t c h 21 }

(37)

Puente V

1 p a c k a g e s i m u l a c i o n.puente; 2 class S i m u l a P u e n t e { 3 p r i v a t e static int n u m U s u a r i o = 0; 4 p r i v a t e static long h o r a I n i c i o; 5 6 public s y n c h r o n i z e d static int s i g U s u a r i o() {

7 n u m U s u a r i o++; 8 return n u m U s u a r i o; 9 } 10 public static int t i e m p o S i m u l a c i o n() {

11 return ( int )((System.c u r r e n t T i m e M i l l i s() - h o r a I n i c i o)/( long ) 1 0 0 0 ) ;

12 }

13 public S i m u l a P u e n t e( double tLlegadaN, double tLlegadaS, int tPuente, int tMax) {

14 /* C u e r p o de s i m u l a P u e n t e */

15 }

16 public static void main (String[] args) {

17 S i m u l a P u e n t e p = new S i m u l a P u e n t e(2 , 2 , 1 , 20); 18 } // end of main () 19 }

(38)

Puente VI

1 p a c k a g e s i m u l a c i o n.puente; 2 import s o p o r t e.A l e a t o r i o; 3 public class G e n e r a d o r C o c h e s e x t e n d s Thread {

4 p r i v a t e S e n t i d o s e n t i d o; 5 p r i v a t e double t L l e g a d a M e d i o C o c h e s; 6 p r i v a t e int t E n P u e n t e; 7 p r i v a t e int t M a x S i m u l a c i o n; 8 p r i v a t e A l e a t o r i o a l e a t o r i o; 9 p r i v a t e Puente puente; 10 public G e n e r a d o r C o c h e s (S e n t i d o stdo, double tll, int tp, int tm, int sm, Puente p){

11 s e n t i d o = stdo; 12 t L l e g a d a M e d i o C o c h e s = tll; 13 t E n P u e n t e = tp; 14 t M a x S i m u l a c i o n = tm; 15 a l e a t o r i o = new A l e a t o r i o(sm); 16 puente = p; 17 }

(39)

Puente VII

1 public void run() {

2 System.out.p r i n t l n( " E m p e z a n d o el s e n t i d o " + s e n t i d o); 3 do { // do - w h i l e ( t i e m p o < t M a x S i m u l a c i o n ) 4 int s i g C o c h e = a l e a t o r i o.p o i s s o n(t L l e g a d a M e d i o C o c h e s); 5 try { 6 this .sleep(s i g C o c h e* 1 0 0 0 ) ; 7 8 } catch ( I n t e r r u p t e d E x c e p t i o n e ) { 9 10 } // end of try - c a t c h 11

Coche coche = new Coche(S i m u l a P u e n t e.s i g U s u a r i o() , sentido, tEnPuente, p

12 coche.start(); 13 } while ( S i m u l a P u e n t e.t i e m p o S i m u l a c i o n() < t M a x S i m u l a c i o n ); 14 15 } 16 }

(40)

Capturando

InterruptedException

I

Semaforo

1 public s y n c h r o n i z e d void P() throws I n t e r r u p t e d E x c e p t i o n{

2 while (s==0) {

3 try {

4

wait(); /* Si me i n t e r r u m p e n ´ıaqu o c u p a m o s el ´asemforo ,

5 pero l a z a m o s la ´o e x c e p c i n */ 6 } catch (I n t e r r u p t e d E x c e p t i o n e) { 7 s- -; 8 throw e; 9 } 10 } 11 s- -; 12 }

(41)

Capturando

InterruptedException

II

VariableCondicion

1 public final void Wait() throws I n t e r r u p t e d E x c e p t i o n {

2 mutex.V(); 3 n u m E s p e r a++; 4 try { 5 s.P(); 6 } catch (I n t e r r u p t e d E x c e p t i o n e) { 7 /* Se ha i n t e r r u m p i d o un p r o c e s o e s p e r a n d o en esta a r i a b l e ´o c o n d i c i n . 8 * El ´a s e m f o r o se q u e d a sin o c u p a r ( ver S e m a f o r o . java ) , ´ahabr que d e c i r que

9 * esta h e b r a no ´aest e s p e r a n d o */ 10 numEspera- -; 11 throw e; 12 } 13 try { 14 mutex.P(); 15 } catch (I n t e r r u p t e d E x c e p t i o n e) { 16 /* Se ha i n t e r r u m p i d o un p r o c e s o que ´ıhaba sido a u t o r i z a d o para e n t r a r

17 * en la v a r i a b l e ´o c o n d i c i n . ´aHabr que l i b e r a r m u t e x y el ´a s e m f o r o . */ 18 numEspera- -; 19 s.V(); 20 mutex.V(); 21 throw e; 22 } 23 }

(42)

Capturando

InterruptedException

III

1 public void p e r m i s o(S e n t i d o s) throws I n t e r r u p t e d E x c e p t i o n {

2 try { 3 mutex.P(); /* si i n t e r r u m p e n a n t e s de entrar , 4 no e n t r a m o s y l i b e r a m o s el m o n i t o r . 5 */ 6 } catch (I n t e r r u p t e d E x c e p t i o n e) { 7 mutex.V(); 8 throw e; 9 } 10 if ( s.equals(S e n t i d o.sur) ) { 11 espS ++; 12 while ( numN > 0 || cupS >=m a x C u p o ) {sur.Wait(); }

13 espS - -; numS++; 14 if ( espN>0 ) {cupS++;} 15 cupN=0; 16 } else { 17 espN ++; 18 while ( numS > 0 || cupN >=m a x C u p o ) {norte.Wait(); }

19 espN - -; numN++; 20 if ( espS>0 ) {cupN++;} 21 cupS=0; 22 } // end of else

(43)

Capturando

InterruptedException

IV

1 public void f i n P e r m i s o(S e n t i d o s) throws I n t e r r u p t e d E x c e p t i o n {

2 try {

3

mutex.P(); /* Si me i n t e r r u m p e n ´ıaqu t e n g o que r e s t a u r a r l i b e r a r el 4 m o n i t o r y d e s p e r t a r a q u i e n lo n e c e s i t e */ 5 } catch (I n t e r r u p t e d E x c e p t i o n e) {} 6 7 if ( s.equals(S e n t i d o.sur) ) { 8 numS- -; 9 if (numS==0) {norte.Signal();};

10 } else {

11

numN- -;

12 if (numN==0) {sur.Signal();};

13 } 14 mutex.V(); 15 }

(44)

Capturando

InterruptedException

I

Es mejor no interrumpir una hebra dentro del monitor, mejor

esperar a que salga.

Dentro del monitor tenemos una variable

ie

que indica si la

(45)

Capturando

InterruptedException

II

Es mejor no interrumpir una hebra dentro del monitor, mejor

esperar a que salga.

Dentro del monitor tenemos una variable

ie

que indica si la

hebra ha sido interrumpida.

(46)

Capturando

InterruptedException

III

Es mejor no interrumpir una hebra dentro del monitor, mejor

esperar a que salga.

Dentro del monitor tenemos una variable

ie

que indica si la

hebra ha sido interrumpida.

mutex.P

,

Wait

, no lanzan una excepciones.Devolver´an una

excepci´on en caso de haberse producido.

Si devuelven una excepci´on el monitor lanza esa excepci´

on

al

(47)

Capturando

InterruptedException

IV

1 public void p e r m i s o(S e n t i d o s) throws I n t e r r u p t e d E x c e p t i o n {

2 I n t e r r u p t e d E x c e p t i o n ie= null ; 3 ie=mutex.P(ie); 4 5 if ( s.equals(S e n t i d o.sur) ) { 6 espS ++; 7 while ( numN > 0 || cupS >=m a x C u p o ) { ie=sur.Wait(ie); }

8 espS - -; numS++; 9 if ( espN>0 ) { cupS++; } 10 cupN=0; 11 } else { // s e n t i d o N o r t e 12 espN ++; 13 while ( numS > 0 || cupN >=m a x C u p o ) {ie=norte.Wait(ie);}

14 espN - -; numN++; 15 if ( espS>0 ) {cupN++;} 16 cupS=0; 17 } 18 mutex.V(); 19 if (ie!= null ) { 20 throw ie; 21 }

(48)

Capturando

InterruptedException

V

1 public void f i n P e r m i s o(S e n t i d o s) throws I n t e r r u p t e d E x c e p t i o n {

2 I n t e r r u p t e d E x c e p t i o n ie= null ; 3 ie=mutex.P(ie); 4 if ( s.equals(S e n t i d o.sur) ) { 5 numS- -; 6 if (numS==0) {norte.Signal();};

7 } else { // S e n t i d o n o r t e

8

numN- -;

9 if (numN==0) {sur.Signal();};

10 } 11 mutex.V(); 12 if (ie!= null ) { 13 throw ie; 14 } 15 }

(49)

Capturando

InterruptedException

VI

1 public final I n t e r r u p t e d E x c e p t i o n Wait(I n t e r r u p t e d E x c e p t i o n ie) {

2 s y n c h r o n i z e d ( this ) {n u m E s p e r a++;} 3 mutex.V(); 4 ie=s.P(ie); 5 ie=mutex.P(ie); 6 return ie; 7 }

(50)

Capturando

InterruptedException

VII

1 public s y n c h r o n i z e d I n t e r r u p t e d E x c e p t i o n P(I n t e r r u p t e d E x c e p t i o n ie) { 2 while (s==0) { 3 try { 4 wait(); 5 } catch (I n t e r r u p t e d E x c e p t i o n e) { 6 ie=e; 7 } 8 } 9 s- -; 10 return ie; 11 }

(51)

Capturando

InterruptedException

VIII

1 public void run() {

2 try {

3

System.out.p r i n t l n( " El coche " +id+ " quiere pasar en s e n t i d o " + s e n t i d o + " : " 4 try {

5

puente.p e r m i s o(s e n t i d o);

6

System.out.p r i n t l n( " El coche " +id+ " ´aest p a s a n d o en s e n t i d o " + s e n t i d o + 7 sleep(t E n P u e n t e* 1 0 0 0 ) ; 8 9 } catch (I n t e r r u p t e d E x c e p t i o n e) { 10

System.out.p r i n t l n( " El coche " +id+ " ha sido i n t e r r u m p i d o " );

11 } f i n a l l y { 12 puente.f i n P e r m i s o(s e n t i d o); 13 } 14

System.out.p r i n t l n( " El coche " +id+ " ha pasado en s e n t i d o " + s e n t i d o + " : " + 15 } catch ( I n t e r r u p t e d E x c e p t i o n e ) { 16 17 } // end of try - c a t c h 18 }

(52)

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de forma

expl´ıcita.

(53)

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de forma

(54)

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de forma

expl´ıcita.

Reflexi´on en Java

.

Control expl´ıcito sobre las colas de procesos, variables

condici´on priorizadas.

Figure

Actualización...

Referencias

Actualización...

Related subjects :