View
245
Download
1
Category
Preview:
Citation preview
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Recommended