Programación Concurrente en Java - Hebras y monitores

54
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 21 de marzo de 2006 Luis Fernando Llana D´ ıaz Departamento de Sistemas Inform´ aticos y Programaci´ onUniversidad Complutense de Madrid Programaci´ on Concurrente en Java

Transcript of Programación Concurrente en Java - Hebras y monitores

Page 1: Programación Concurrente en Java - Hebras y monitores

Programacion Concurrente en Java

Hebras y monitores

Luis Fernando Llana Dıaz

Departamento de Sistemas Informaticos y Programacion

Universidad Complutense de Madrid

21 de marzo de 2006

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 2: Programación Concurrente en Java - Hebras y monitores

Threads

Extendiendo la clase java.lang.Thread.

28public class PrThread extends Thread{

29public PrThread(String s) {

30super(s);

31}

32public final void run() {

33boolean sigue=true;

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

35try {

36System.out.println(getName ()+":"+i);

37sleep (20);

38} catch (InterruptedException e) {

39System.out.println(getName ()+" interrumpida");

40sigue=false;

41}

42}

43}

44public static final void main(final String [] args ){

45Thread p = new PrThread("mia");

46p.start ();

47}

48}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 3: Programación Concurrente en Java - Hebras y monitores

Threads

Implementado el interfaz java.lang.Runnable.

26public class PrRunnable implements Runnable {

27public final void run() {

28Thread hebra = Thread.currentThread ();

29boolean sigue=true;

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

31try {

32System.out.println(hebra.getName ()+":"+i);

33hebra.sleep (20);

34} catch (InterruptedException e) {

35System.out.println(hebra.getName ()+" interrumpida");

36sigue=false;

37}

38}

39}

40public static final void main(final String [] args) {

41Thread p = new Thread(new PrRunnable (),"mia");

42p.start ();

43}

44}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 4: Programación Concurrente en Java - Hebras y monitores

Ciclo de vida de una hebra

Tras crear una hebra y se ejecuta el metodo start, la hebra puedeestar:

1 En ejecucion.

2 Suspendida: ha ejecutado sleep, join, wait.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 5: Programación Concurrente en Java - Hebras y monitores

Parar una hebra

Usar el metodo interrupt

1public static void ex1() throws InterruptedException {

2Thread h = new PrThread("1");

3h.start ();

4Thread.sleep (100);

5h.interrupt ();

6System.out.println(h.isInterrupted ());

7}

Metodos Deprecated: stop, suspend, resume.Una hebra para cunado esta Not Runnnable, ha ejecutado sleep,join, wait.Pueden lanzar InterruptedException, la hebra decide si para osigue.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 6: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: join

1public static void ex2() throws InterruptedException {

2Thread h1 = new PrThread("1");

3Thread h2 = new PrThread("2");

4Thread h3 = new PrThread("3");

5h1.start ();

6h2.start ();

7h3.start ();

8h1.join ();

9h2.join ();

10h3.join ();

11}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 7: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: join

h3.start()

h1.start()

h2.start()

h1.join()

h2.join()

h3.join()

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 8: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: join

h3.start()

h1.start()

h2.start()

h1.join()

h2.join()

h3.join()

1 h1.start(): h1 se ejecuta.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 9: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: 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.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 10: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: 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.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 11: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: 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.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 12: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: 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.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 13: Programación Concurrente en Java - Hebras y monitores

Esperamos a que una hebra acabe

Metodo: 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

pare (no hace falta).

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 14: Programación Concurrente en Java - Hebras y monitores

Cerrojos de objetos

Cada objeto en Java tiene un cerrojo

1synchronized (obj) {

2/* */

3}

El cerrojo puede abarcar a todo un metodo

1type method (...) {

2synchronized(this) {

3/* */

4}

1synchronized type method (...) {

2/* */

3}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 15: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized?

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 16: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 17: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor?

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 18: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor? las variables condicion.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 19: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor? las variables condicion.

Todos los objetos tienen los metodos wait(), notify() ynotifyAll().

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 20: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor? las variables condicion.

Todos los objetos tienen los metodos wait(), notify() ynotifyAll().

Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 21: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor? las variables condicion.

Todos los objetos tienen los metodos wait(), notify() ynotifyAll().

Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.

¿Que hacemos si hay varias variables condicion?

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 22: Programación Concurrente en Java - Hebras y monitores

Variables condicion

¿Que ocurre si todos los metodos son synchronized? solo sepuede ejecutar un metodo a la vez

¿Que falta para tener un monitor? las variables condicion.

Todos los objetos tienen los metodos wait(), notify() ynotifyAll().

Un objeto con todos los metodos synchronized es unmonitor con una sola variable condicion.

¿Que hacemos si hay varias variables condicion? Todo monitorse puede hacer con una unica variable condicion, con perdidade eficiencia: metodo notifyAll().

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 23: Programación Concurrente en Java - Hebras y monitores

Monitor puente

Tiene dos variables condicion: norte y sur.

1procedure permiso(sentido s) {

2if (s.equals(Sentido.sur)) {

3espS ++;

4while ( numN > 0 || cupS >= maxCupo ) {

5wait(sur);

6}

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

8if (espN >0) {

9cupS ++;

10}

11} else { // el sentido norte

12[[ similar ]]

13}

14}

15procedure finPermiso(sentido s) {

16if (s.equals(Sentido.sur)) {

17numS --;

18singal(norte);

19} else {// sentido norte

20[[ similar ....]]

21}

22}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 24: Programación Concurrente en Java - Hebras y monitores

Puente, version Java facil

1private int espN = 0, espS = 0;

2private int numN = 0, numS = 0;

3private int cupN = 0, cupS = 0;

4

5private int maxCupo;

6

7public synchronized void permiso(Sentido s) throws InterruptedException {

8if ( s.equals(Sentido.sur) ) {

9espS ++;

10while ( numN > 0 || cupS >=maxCupo ) { wait (); }

11espS --; numS ++;

12if ( espN >0 ) { cupS ++; }

13cupN =0;

14} else {

15/* sentido Norte , complementario al anterior */

16}

17}

18public synchronized void finPermiso(Sentido s) {

19if ( s.equals(Sentido.sur) ) { numS --; }

20else { numN --; }

21notifyAll ();

22}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 25: Programación Concurrente en Java - Hebras y monitores

Implementacion de monitores

1a idea: cada objeto es un semaforo

1Object norte , sur;

2public synchronized void permiso(Sentido s) {

3if ( s.equals(Sentido.sur) ) {

4espS ++;

5while ( numN >0 || cupS >= maxCupo ) {

6sur.wait ();

7}

8/* ... */

9} else {

10espN ++;

11while ( numS >0 || cupN >= maxCupo ) {

12norte.wait ();

13}

14/* ... */

15}

16}

Si el proceso se queda esperando en sur.wait(), no libera elobjeto monitor: ¡¡Se queda bloqueado!!

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 26: Programación Concurrente en Java - Hebras y monitores

Implementacion de monitores

1 Cada objeto es un semaforo.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 27: Programación Concurrente en Java - Hebras y monitores

Implementacion de monitores

1 Cada objeto es un semaforo.

2 Por cada variable condicion es necesario un objeto semaforo.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 28: Programación Concurrente en Java - Hebras y monitores

Implementacion de monitores

1 Cada objeto es un semaforo.

2 Por cada variable condicion es necesario un objeto semaforo.

3 Antes de esperar en un wait hemos de abandonar el monitor.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 29: Programación Concurrente en Java - Hebras y monitores

Implementacion de monitores

1 Cada objeto es un semaforo.

2 Por cada variable condicion es necesario un objeto semaforo.

3 Antes de esperar en un wait hemos de abandonar el monitor.

4 Es necesario un semaforo para entrar y salir del monitor.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 30: Programación Concurrente en Java - Hebras y monitores

Semaforos

1public final class Semaforo {

2String nombre;

3int s;

4public Semaforo(int inicial , String _nombre) {

5s=inicial;

6nombre=_nombre;

7} // Semaforo constructor

8public synchronized void P() throws InterruptedException {

9while (s==0) { wait (); }

10s--;

11}

12public synchronized void V() {

13s++;

14notify ();

15}

16}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 31: Programación Concurrente en Java - Hebras y monitores

Variables Condicion I

1 Una variable condicion basicamente es un semaforo.

2 Necesitamos tambien el semaforo del monitor para poder salirantes de un wait y entrar despues.

1Semaforo mutex;

2public final void Wait () throws InterruptedException {

3mutex.V();

4numEspera ++;

5s.P();

6mutex.P();

7}

Nota: el metodo wait es final en la clase Object.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 32: Programación Concurrente en Java - Hebras y monitores

Variables Condicion II

1public class VariableCondicion {

2int numEspera;

3Semaforo s;

4Semaforo mutex;

5public VariableCondicion(Semaforo _mutex , String nombre) {

6s = new Semaforo(0,nombre );

7numEspera = 0;

8mutex = _mutex;

9}

10public synchronized final void Signal () {

11if (numEspera >0) {

12numEspera --;

13s.V();

14}

15}

16}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 33: Programación Concurrente en Java - Hebras y monitores

Puente I

1public class Puente {

2VariableCondicion norte ,sur;

3Semaforo mutex;

4private int espN = 0, espS = 0;

5private int numN = 0, numS = 0;

6private int cupN = 0, cupS = 0;

7private int maxCupo;

8

9public void permiso(Sentido s) {

10mutex.P();

11if ( s.equals(Sentido.sur) ) {

12espS ++;

13while ( numN > 0 || cupS >=maxCupo ) { sur.Wait (); }

14espS --; numS ++;

15if ( espN >0 ) { cupS ++; }

16cupN =0;

17} else {

18/* sentido Norte , caso simetrico al anterior */

19}

20mutex.V();

21}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 34: Programación Concurrente en Java - Hebras y monitores

Puente II

1public void finPermiso(Sentido s) {

2mutex.P();

3if ( s.equals(Sentido.sur) ) {

4numS --;

5if (numS ==0) {norte.Signal ();};

6} else {

7numN --;

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

9}

10mutex.V();

11}

12public Puente(int cupo) {

13maxCupo = cupo;

14mutex = new Semaforo(1,"mutex");

15norte = new VariableCondicion(mutex ,"norte");

16sur = new VariableCondicion(mutex ,"norte");

17}

18}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 35: Programación Concurrente en Java - Hebras y monitores

Puente III

1package simulacion.puente;

2public class Coche extends Thread {

3private Sentido sentido;

4private int id , tEnPuente;

5private long horaInicio;

6private Puente puente;

7public Coche (int i, Sentido s, int t, Puente p){

8sentido = s; id = i; tEnPuente = t; puente = p;

9}

10public void run() {

11System.out.println("El coche "+id+" quiere pasar en sentido "+

12sentido + ":" + SimulaPuente.tiempoSimulacion ());

13puente.permiso(sentido );

14System.out.println("El coche "+id+" aest pasando en sentido "+

15sentido + ":" + SimulaPuente.tiempoSimulacion ());

16try {

17this.sleep(tEnPuente *1000);

18} catch ( InterruptedException e ) {}

19puente.finPermiso(sentido );

20System.out.println("El coche "+id+" ha pasado en sentido "+

21sentido + ":" + SimulaPuente.tiempoSimulacion ());

22}

23}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 36: Programación Concurrente en Java - Hebras y monitores

Puente IV

1public SimulaPuente(double tLlegadaN , double tLlegadaS , int tPuente , int tMax) {

2Puente puente = new Puente (5);

3GeneradorCoches generaNorte = new GeneradorCoches(Sentido.norte ,

4tLlegadaN ,

5tPuente , tMax ,

63333,

7puente );

8GeneradorCoches generaSur = new GeneradorCoches(Sentido.sur ,

9tLlegadaS ,

10tPuente , tMax ,

111111,

12puente );

13generaNorte.start ();

14generaSur.start ();

15horaInicio = System.currentTimeMillis ();

16try {

17generaNorte.join ();

18generaSur.join ();

19} catch ( InterruptedException e ) {

20} // end of try -catch

21}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 37: Programación Concurrente en Java - Hebras y monitores

Puente V

1package simulacion.puente;

2class SimulaPuente {

3private static int numUsuario = 0;

4private static long horaInicio;

5

6public synchronized static int sigUsuario () {

7numUsuario ++;

8return numUsuario;

9}

10public static int tiempoSimulacion () {

11return (int )(( System.currentTimeMillis () - horaInicio )/( long )1000);

12}

13public SimulaPuente(double tLlegadaN , double tLlegadaS , int tPuente , int tMax) {

14/* Cuerpo de simula Puente */

15}

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

17SimulaPuente p = new SimulaPuente (2, 2, 1, 20);

18} // end of main ()

19}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 38: Programación Concurrente en Java - Hebras y monitores

Puente VI

1package simulacion.puente;

2import soporte.Aleatorio;

3public class GeneradorCoches extends Thread {

4private Sentido sentido;

5private double tLlegadaMedioCoches;

6private int tEnPuente;

7private int tMaxSimulacion;

8private Aleatorio aleatorio;

9private Puente puente;

10public GeneradorCoches (Sentido stdo , double tll , int tp , int tm , int sm , Puente p){

11sentido = stdo;

12tLlegadaMedioCoches = tll;

13tEnPuente = tp;

14tMaxSimulacion = tm;

15aleatorio = new Aleatorio(sm);

16puente = p;

17}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 39: Programación Concurrente en Java - Hebras y monitores

Puente VII

1public void run() {

2System.out.println("Empezando el sentido "+ sentido );

3do {// do -while ( tiempo < tMaxSimulacion )

4int sigCoche = aleatorio.poisson(tLlegadaMedioCoches );

5try {

6this.sleep(sigCoche *1000);

7

8} catch ( InterruptedException e ) {

9

10} // end of try -catch

11Coche coche = new Coche(SimulaPuente.sigUsuario (), sentido , tEnPuente , p

12coche.start ();

13} while ( SimulaPuente.tiempoSimulacion () < tMaxSimulacion );

14

15}

16}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 40: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException I

Semaforo

1public synchronized void P() throws InterruptedException {

2while (s==0) {

3try {

4wait (); /* Si me interrumpen ıaqu ocupamos el asemforo ,

5pero lazamos la oexcepcin */

6} catch (InterruptedException e) {

7s--;

8throw e;

9}

10}

11s--;

12}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 41: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException II

VariableCondicion

1public final void Wait () throws InterruptedException {

2mutex.V();

3numEspera ++;

4try {

5s.P();

6} catch (InterruptedException e) {

7/* Se ha interrumpido un proceso esperando en esta ariable ocondicin .

8* El asemforo se queda sin ocupar (ver Semaforo .java), ahabr que decir que

9* esta hebra no aest esperando */

10numEspera --;

11throw e;

12}

13try {

14mutex.P();

15} catch (InterruptedException e) {

16/* Se ha interrumpido un proceso que ıhaba sido autorizado para entrar

17* en la variable ocondicin . aHabr que liberar mutex y el asemforo.*/

18numEspera --;

19s.V();

20mutex.V();

21throw e;

22}

23}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 42: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException III

1public void permiso(Sentido s) throws InterruptedException {

2try {

3mutex.P();/* si interrumpen antes de entrar ,

4no entramos y liberamos el monitor.

5*/

6} catch (InterruptedException e) {

7mutex.V();

8throw e;

9}

10if ( s.equals(Sentido.sur) ) {

11espS ++;

12while ( numN > 0 || cupS >=maxCupo ) {sur.Wait (); }

13espS --; numS ++;

14if ( espN >0 ) {cupS ++;}

15cupN =0;

16} else {

17espN ++;

18while ( numS > 0 || cupN >=maxCupo ) {norte.Wait (); }

19espN --; numN ++;

20if ( espS >0 ) {cupN ++;}

21cupS =0;

22} // end of else

23mutex.V();

24}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 43: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException IV

1public void finPermiso(Sentido s) throws InterruptedException {

2try {

3mutex.P();/* Si me interrumpen ıaqu tengo que restaurar liberar el

4monitor y despertar a quien lo necesite */

5} catch (InterruptedException e) {}

6

7if ( s.equals(Sentido.sur) ) {

8numS --;

9if (numS ==0) {norte.Signal ();};

10} else {

11numN --;

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

13}

14mutex.V();

15}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 44: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException I

Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.

Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 45: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException II

Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.

Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.

mutex.P, Wait, no lanzan una excepciones.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 46: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException III

Es mejor no interrumpir una hebra dentro del monitor, mejoresperar a que salga.

Dentro del monitor tenemos una variable ie que indica si lahebra ha sido interrumpida.

mutex.P, Wait, no lanzan una excepciones.Devolveran unaexcepcion en caso de haberse producido.

Si devuelven una excepcion el monitor lanza esa excepcion alfinal.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 47: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException IV

1public void permiso(Sentido s) throws InterruptedException {

2InterruptedException ie=null;

3ie=mutex.P(ie);

4

5if ( s.equals(Sentido.sur) ) {

6espS ++;

7while ( numN > 0 || cupS >=maxCupo ) { ie=sur.Wait(ie); }

8espS --; numS ++;

9if ( espN >0 ) { cupS ++; }

10cupN =0;

11} else {// sentido Norte

12espN ++;

13while ( numS > 0 || cupN >=maxCupo ) {ie=norte.Wait(ie);}

14espN --; numN ++;

15if ( espS >0 ) {cupN ++;}

16cupS =0;

17}

18mutex.V();

19if (ie!=null) {

20throw ie;

21}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 48: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException V

1public void finPermiso(Sentido s) throws InterruptedException {

2InterruptedException ie=null;

3ie=mutex.P(ie);

4if ( s.equals(Sentido.sur) ) {

5numS --;

6if (numS ==0) {norte.Signal ();};

7} else {// Sentido norte

8numN --;

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

10}

11mutex.V();

12if (ie!=null) {

13throw ie;

14}

15}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 49: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException VI

1public final InterruptedException Wait(InterruptedException ie) {

2synchronized (this) {numEspera ++;}

3mutex.V();

4ie=s.P(ie);

5ie=mutex.P(ie);

6return ie;

7}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 50: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException VII

1public synchronized InterruptedException P(InterruptedException ie) {

2while (s==0) {

3try {

4wait ();

5} catch (InterruptedException e) {

6ie=e;

7}

8}

9s--;

10return ie;

11}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 51: Programación Concurrente en Java - Hebras y monitores

Capturando InterruptedException VIII

1public void run() {

2try {

3System.out.println("El coche "+id+" quiere pasar en sentido "+ sentido + ":"

4try {

5puente.permiso(sentido );

6System.out.println("El coche "+id+" aest pasando en sentido "+ sentido +

7sleep(tEnPuente *1000);

8

9} catch (InterruptedException e) {

10System.out.println("El coche "+id+" ha sido interrumpido");

11} finally {

12puente.finPermiso(sentido );

13}

14System.out.println("El coche "+id+" ha pasado en sentido "+ sentido + ":" +

15} catch ( InterruptedException e ) {

16

17} // end of try -catch

18}

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 52: Programación Concurrente en Java - Hebras y monitores

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de formaexplıcita.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 53: Programación Concurrente en Java - Hebras y monitores

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de formaexplıcita. Reflexion en Java.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java

Page 54: Programación Concurrente en Java - Hebras y monitores

Problemas, mejoras

Las entradas y las salidas del monitor se hacen de formaexplıcita. Reflexion en Java.

Control explıcito sobre las colas de procesos, variablescondicion priorizadas.

Luis Fernando Llana Dıaz Departamento de Sistemas Informaticos y ProgramacionUniversidad Complutense de Madrid

Programacion Concurrente en Java